什么是scanf vs vs fgets的选项?

时间:2015-06-16 15:33:19

标签: c string scanf fgets format-specifiers

我有以下代码

while ( a != 5)
 scanf("%s", buffer);

这很好但在所提到的单词之间没有空格,换句话说,如果我们使用空格来扫描则scanf终止

如果我使用这个

while( a != 5)
 scanf("%[^\n]", buffer);

它仅适用于一次不好的

我从不使用gets(),因为我知道它有多讨厌......

我的最后一个选择是

while( a != 5)
  fgets(buffer, sizeof(buffer), stdin);

所以我的问题是

  1. 为什么第二个命令在循环内部不起作用?
  2. 我需要用空格扫描字符串的其他选项是什么?

2 个答案:

答案 0 :(得分:1)

  

为什么第二个命令在循环中不起作用

因为你第一次扫描直到\n\n仍留在输入缓冲区中。您需要从缓冲区吃掉(或者换句话说,丢弃)存储的换行符。您可以使用while (getchar()!= \ n );来完成这项工作。

  

我需要用空格扫描字符串的其他选项是什么?

嗯,你快到了。您需要使用fgets()。使用它,你可以

  1. 安全缓冲区溢出(克服gets()的限制)
  2. 使用空格输入字符串(克服%s的限制)
  3. 但是,请记住,fgets()读取并存储尾随换行符,因此您可能想要删除它,并且您必须自己手动执行此操作。

答案 1 :(得分:1)

"%[^\n]"将尝试扫描所有内容,直到换行。输入中的下一个字符是\n,因此您应该跳过它以转到下一行。

尝试:"%[^\n]%*c"%*c将丢弃下一个字符,即换行字符。