什么是选项 scanf vs gets vs fgets?
What are options scanf vs gets vs fgets?
我有以下代码
while ( a != 5)
scanf("%s", buffer);
这很好用,但是在提到的词之间没有 space 或者换句话说,如果我们使用 spaces 扫描
,scanf 就会终止
如果我用这个
while( a != 5)
scanf("%[^\n]", buffer);
只能用一次,不好
我从不使用 gets()
因为我知道它有多讨厌..
我最后的选择是这个
while( a != 5)
fgets(buffer, sizeof(buffer), stdin);
所以我的问题是
- 为什么第二个命令在循环内不起作用?
- 我必须使用 spaces 扫描字符串的其他选项是什么?
Why the second command is not working inside the loop
因为,您第一次扫描直到\n
,\n
仍保留在输入缓冲区中。您需要吃掉(或者,换句话说,丢弃)缓冲区中存储的换行符。您可以使用 while (getchar()!=
\n);
来完成这项工作。
What are the other options I have to scan a string with spaces?
好吧,你快到了。您需要使用 fgets()
。使用它,您可以
- 避免缓冲区溢出(克服
gets()
的限制)
- 输入带 空格的字符串(克服
%s
的限制)
但是,请记住,fgets()
读取并存储尾随的换行符,因此您可能想要删除它,您必须自己手动执行此操作。
"%[^\n]"
将尝试扫描所有内容,直到出现换行符。输入中的下一个字符将是 \n
,因此您应该跳过它以进入下一行。
尝试:"%[^\n]%*c"
,%*c
会丢弃下一个字符,即换行符。
我有以下代码
while ( a != 5)
scanf("%s", buffer);
这很好用,但是在提到的词之间没有 space 或者换句话说,如果我们使用 spaces 扫描
,scanf 就会终止如果我用这个
while( a != 5)
scanf("%[^\n]", buffer);
只能用一次,不好
我从不使用 gets()
因为我知道它有多讨厌..
我最后的选择是这个
while( a != 5)
fgets(buffer, sizeof(buffer), stdin);
所以我的问题是
- 为什么第二个命令在循环内不起作用?
- 我必须使用 spaces 扫描字符串的其他选项是什么?
Why the second command is not working inside the loop
因为,您第一次扫描直到\n
,\n
仍保留在输入缓冲区中。您需要吃掉(或者,换句话说,丢弃)缓冲区中存储的换行符。您可以使用 while (getchar()!=
\n);
来完成这项工作。
What are the other options I have to scan a string with spaces?
好吧,你快到了。您需要使用 fgets()
。使用它,您可以
- 避免缓冲区溢出(克服
gets()
的限制) - 输入带 空格的字符串(克服
%s
的限制)
但是,请记住,fgets()
读取并存储尾随的换行符,因此您可能想要删除它,您必须自己手动执行此操作。
"%[^\n]"
将尝试扫描所有内容,直到出现换行符。输入中的下一个字符将是 \n
,因此您应该跳过它以进入下一行。
尝试:"%[^\n]%*c"
,%*c
会丢弃下一个字符,即换行符。