什么是选项 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);

所以我的问题是

  1. 为什么第二个命令在循环内不起作用?
  2. 我必须使用 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()。使用它,您可以

  1. 避免缓冲区溢出(克服 gets() 的限制)
  2. 输入带 空格的字符串(克服 %s 的限制)

但是,请记住,fgets() 读取并存储尾随的换行符,因此您可能想要删除它,您必须自己手动执行此操作。

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

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