在C中scanf()之后使用fgets()/gets()/scanf()时出现问题

scanf() 是C语言中的一个库函数。它从标准输入读取标准输入。 fgets() 是C语言中的一个库函数。它从指定的流中读取一行,并将其存储到字符串变量所指向的字符串中。仅在以下情况之一时终止:

null
  • 到达文件末尾
  • 读取n-1个字符
  • 换行符被读取

1) 在C.中考虑下面一个简单的程序,程序使用SCANFER()读取一个整数,然后使用FGSH()读取字符串,

输入

10
test

C

// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include <stdio.h>
int main()
{
int x;
char str[100];
scanf ( "%d" , &x);
fgets (str, 100, stdin);
printf ( "x = %d, str = %s" , x, str);
return 0;
}


输出

x = 10, str = 

说明: 上述代码的问题是scanf()读取一个整数,并在缓冲区中留下一个换行符。因此fgets()只读取换行符,程序忽略字符串“test”。

2) 在循环中使用scanf()时也会出现类似的问题。

输入:

a
b
q 

C

// C program to demonstrate the problem when
// scanf() is used in a loop
#include <stdio.h>
int main()
{
char c;
printf ( "Press q to quit" );
do {
printf ( "Enter a character" );
scanf ( "%c" , &c);
printf ( "%c" , c);
} while (c != 'q' );
return 0;
}


输出

Press q to quit
Enter a character
a
Enter a character


Enter a character
b
Enter a character


Enter a character
q

说明: 我们可以注意到,上面的程序打印了一个额外的“输入字符”,后跟一个额外的换行符。这是因为每个scanf()都会在缓冲区中留下一个换行符,由下一个scanf读取。

如何解决上述问题?

  • 我们可以 scanf() 用额外的单词读一行新词 ,即。, scanf(“%d”)“,&x) 事实上 scanf(“%d”、&x) 也可以(注意额外的空间)。
  • 我们可以添加一个 getchar() 之后 scanf() 多读一行新词。

上述各点的修正程序如下:,

1) scanf()当后面有fgets()时:

输入:

10
test

C

// C program to demonstrate the problem when
// fgets()/gets() is used after scanf()
#include <stdio.h>
int main()
{
int x;
char str[100];
scanf ( "%d" , &x);
fgets (str, 100, stdin);
printf ( "x = %d, str = %s" , x, str);
return 0;
}


输出

x = 10, str = test

2) 在循环中使用scanf()时:

输入:

a
b
q 

C

// C program to demonstrate the problem when
// scanf() is used in a loop
#include <stdio.h>
// Driver Code
int main()
{
char c;
printf ( "Press q to quit" );
do {
printf ( "Enter a character" );
scanf ( "%c" , &c);
printf ( "%c" , c);
} while (c != 'q' );
return 0;
}


输出: 按q键退出

Enter a character
a
Enter a character
b
Enter a character
q

必须阅读: 在nextXXX()之后使用nextLine()时,Java中的扫描仪会出现问题

本文由 德埃拉吉·古普塔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享