多个字符数组的输入不起作用
Input of multiple char arrays isn't working
char toFind[100];
char replace[100];
int pos = 0;
printf("Enter a text: ");
scanf("%[^\n]", str);
printf("Enter a search pattern: ");
scanf("%[^\n]", toFind);
printf("Enter a substitute: ");
scanf("%[^\n]", replace);
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s", str);
此代码示例让我读取了 str 的值,但跳过了其他两个 scanf。我不知道为什么。
我该怎么做才能解决这个问题?
Ps: str 是一个全局字符数组
这取决于您 运行 编译代码的位置 - 操作系统。在某些情况下,当按下“Enter”键时,输入流中会发出两个字节(10 和 13)而不是 '\n' (10)。在这种情况下,您需要刷新额外的符号。查看评论以了解确切的实施方式。
在 scanf
的这个调用之后
scanf("%[^\n]", str);
换行符 '\n'
仍然存在于输入缓冲区中。
所以下一次调用 scanf
scanf("%[^\n]", toFind);
读取输入直到遇到换行符 '\n'
什么都不读取。
例如你应该这样写
scanf("%[^\n]%*c", str);
从输入缓冲区中删除换行符'\n'
。
这里有一个演示程序
#include <stdio.h>
int main( void )
{
char s[100];
scanf( "%99[^\n]%*c", s );
puts( s );
scanf( "%99[^\n]", s );
puts( s );
return 0;
}
在这种情况下,如果要输入字符串,例如
Hello
World
那么输出将是
Hello
World
另一种更简单的方法是在格式字符串前加上一个空格。例如
scanf(" %[^\n]", toFind);
^^^^
在这种情况下,将跳过所有前导白色 space 字符。
这是一个演示程序。
#include <stdio.h>
int main( void )
{
char s[100];
scanf( "%99[^\n]", s );
puts( s );
scanf( " %99[^\n]", s );
puts( s );
return 0;
}
在这种情况下,如果输入如上所示的字符串,则为
Hello
World
那么程序输出将是
Hello
World
您的scanf()
用法有问题:scanf("%[^\n]", str);
您没有指定要存储到 str
中的最大字符数,因此用户键入足够长的行将导致未定义的行为。这是黑客可以尝试和利用的典型软件缺陷。您可以通过将限制指定为 scanf("%99[^\n]", str);
来防止这种情况
您没有读取用户输入的尾随换行符,因此下一次调用 scanf("%[^\n]", toFind);
将失败,因为输入流中不存在与 '\n'
不同的字符,因为第一个未决字节是 '\n'
,或 EOF
.
您不检查 scanf()
调用的 return 值,因此您无法检测到上述输入错误。
但是请注意,如果用户立即输入 enter,scanf("%99[^\n]", str);
将会失败,并且 str
在这种情况下不会被修改。
对于此任务,使用 fgets()
而不是 scanf()
更安全:
char str[100];
char toFind[100];
char replace[100];
int pos = 0;
printf("Enter a text: ");
if (!fgets(str, sizeof str, stdin)) {
printf("input error\n");
return 1;
}
str[strcspn(str, "\n")] = '[=10=]'; /* strip the trailing newline if any */
printf("Enter a search pattern: ");
if (!fgets(toFind, sizeof toFind, stdin)) {
printf("input error\n");
return 1;
}
toFind[strcspn(toFind, "\n")] = '[=10=]'; /* strip the trailing newline if any */
printf("Enter a substitute: ");
if (!fgets(replace, sizeof replace, stdin)) {
printf("input error\n");
return 1;
}
replace[strcspn(replace, "\n")] = '[=10=]'; /* strip the trailing newline if any */
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s\n", str);
char toFind[100];
char replace[100];
int pos = 0;
printf("Enter a text: ");
scanf("%[^\n]", str);
printf("Enter a search pattern: ");
scanf("%[^\n]", toFind);
printf("Enter a substitute: ");
scanf("%[^\n]", replace);
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s", str);
此代码示例让我读取了 str 的值,但跳过了其他两个 scanf。我不知道为什么。 我该怎么做才能解决这个问题?
Ps: str 是一个全局字符数组
这取决于您 运行 编译代码的位置 - 操作系统。在某些情况下,当按下“Enter”键时,输入流中会发出两个字节(10 和 13)而不是 '\n' (10)。在这种情况下,您需要刷新额外的符号。查看评论以了解确切的实施方式。
在 scanf
scanf("%[^\n]", str);
换行符 '\n'
仍然存在于输入缓冲区中。
所以下一次调用 scanf
scanf("%[^\n]", toFind);
读取输入直到遇到换行符 '\n'
什么都不读取。
例如你应该这样写
scanf("%[^\n]%*c", str);
从输入缓冲区中删除换行符'\n'
。
这里有一个演示程序
#include <stdio.h>
int main( void )
{
char s[100];
scanf( "%99[^\n]%*c", s );
puts( s );
scanf( "%99[^\n]", s );
puts( s );
return 0;
}
在这种情况下,如果要输入字符串,例如
Hello
World
那么输出将是
Hello
World
另一种更简单的方法是在格式字符串前加上一个空格。例如
scanf(" %[^\n]", toFind);
^^^^
在这种情况下,将跳过所有前导白色 space 字符。
这是一个演示程序。
#include <stdio.h>
int main( void )
{
char s[100];
scanf( "%99[^\n]", s );
puts( s );
scanf( " %99[^\n]", s );
puts( s );
return 0;
}
在这种情况下,如果输入如上所示的字符串,则为
Hello
World
那么程序输出将是
Hello
World
您的scanf()
用法有问题:scanf("%[^\n]", str);
您没有指定要存储到
来防止这种情况str
中的最大字符数,因此用户键入足够长的行将导致未定义的行为。这是黑客可以尝试和利用的典型软件缺陷。您可以通过将限制指定为scanf("%99[^\n]", str);
您没有读取用户输入的尾随换行符,因此下一次调用
scanf("%[^\n]", toFind);
将失败,因为输入流中不存在与'\n'
不同的字符,因为第一个未决字节是'\n'
,或EOF
.您不检查
scanf()
调用的 return 值,因此您无法检测到上述输入错误。但是请注意,如果用户立即输入 enter,
scanf("%99[^\n]", str);
将会失败,并且str
在这种情况下不会被修改。
对于此任务,使用 fgets()
而不是 scanf()
更安全:
char str[100];
char toFind[100];
char replace[100];
int pos = 0;
printf("Enter a text: ");
if (!fgets(str, sizeof str, stdin)) {
printf("input error\n");
return 1;
}
str[strcspn(str, "\n")] = '[=10=]'; /* strip the trailing newline if any */
printf("Enter a search pattern: ");
if (!fgets(toFind, sizeof toFind, stdin)) {
printf("input error\n");
return 1;
}
toFind[strcspn(toFind, "\n")] = '[=10=]'; /* strip the trailing newline if any */
printf("Enter a substitute: ");
if (!fgets(replace, sizeof replace, stdin)) {
printf("input error\n");
return 1;
}
replace[strcspn(replace, "\n")] = '[=10=]'; /* strip the trailing newline if any */
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s\n", str);