📜  后面有fgets()/ gets()/ scanf()时,scanf()有问题

📅  最后修改于: 2021-05-26 00:44:19             🧑  作者: Mango

考虑下面的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函数读取。

如何解决以上问题?

  1. 我们可以使用额外的“ \ n”使scanf()读取新行,即scanf(“%d \ n”,&x) 。实际上scanf(“%d”,&x)也可以工作(注意多余的空间)。
  2. 我们可以在scanf()之后添加一个getchar()来读取额外的换行符。

有关更正的程序,请参见此内容。

在nextXXX()之后使用nextLine()时, Java的扫描程序也会发生相同的问题。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。