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