考虑下面的C语言简单程序。该程序使用scanf()读取一个整数,然后使用fgets()读取一个字符串。
// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include
int main()
{
int x;
char str[100];
scanf("%d", &x);
fgets(str, 100, stdin);
printf("x = %d, str = %s", x, str);
return 0;
}
输入
10
test
输出:
x = 10, str =
以上代码的问题是scanf()的读取的整数,并且在叶子缓冲液中的换行字符。因此fgets()仅读取换行符,并且字符串“ test”被程序忽略。
在循环中使用scanf()时,也会发生类似的问题。
// C program to demonstrate the problem when
// scanf() is used in a loop
#include
int main()
{
char c;
printf("......Enter q to quit......\n");
do
{
printf("Enter a character\n");
scanf("%c", &c);
printf("%c\n", c);
}
while (c != 'q');
return 0;
}
输入
a
b
q
输出:
......Enter q to quit......
Enter a character
a
Enter a character
Enter a character
b
Enter a character
Enter a character
q
我们可以注意到,上面的程序会打印一个额外的“输入字符”,然后再打印一个新行。这是因为每个scanf()的叶子在缓冲区中的字符由下一scanf函数读取。
如何解决以上问题?
- 我们可以使用额外的“ \ n”使scanf()读取新行,即scanf(“%d \ n”,&x) 。实际上scanf(“%d”,&x)也可以工作(注意多余的空间)。
- 我们可以在scanf()之后添加一个getchar()来读取额外的换行符。
有关更正的程序,请参见此内容。
在nextXXX()之后使用nextLine()时, Java的扫描程序也会发生相同的问题。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。