c - scanf: "%[^\n]"跳过第二个输入但 "%[^\n]"没有。为什么?

标签 c scanf

考虑以下代码:

#include <stdio.h>

int main (void)
{
  char str1[128], str2[128], str3[128];

  printf ("\nEnter str1: ");
  scanf ("%[^\n]", str1);
  printf ("\nstr1 = %s", str1);

  printf ("\nEnter str2: ");
  scanf ("%[^\n]", str2);
  printf ("\nstr2 = %s", str2);

  printf ("\nEnter str3: ");
  scanf ("%[^\n]", str3);
  printf ("\nstr3 = %s", str3);

  printf ("\n");
  return 0;
}

当它被执行时,只有第一个 scanf 会因提示而停止。该程序不会为下一个 scanf 停止。但是如果把格式字符串从"%[^\n]"改成"%[^\n]"(注意%<之前的空格),那么它就可以正常工作。是否自动接受了先前输入缓冲区中的某些现有换行符?但是刷新 stdin 并不能解决这个问题。

这是什么原因。

最佳答案

您只需要在阅读完想要的内容后“消费”'\n' 字符即可。使用以下格式指令:

"%[^\n]%*c"

这会将换行符之前的所有内容读入您传入的字符串中,然后将使用单个字符(换行符)而不将其分配给任何内容('*' 是“赋值抑制” ).

否则,换行符将留在输入流中,等待立即终止后续的 "%[^\n]" 格式指令。

将空格字符添加到格式指令 ("%[^\n]") 的问题在于空格将匹配任何 空格。因此,它会吃掉上一个输入末尾的换行符,但它也会吃掉任何其他空格(包括多个换行符)。

更新您的示例:

  char* fmt = "%[^\n]%*c";

  printf ("\nEnter str1: ");
  scanf (fmt, str1);
  printf ("\nstr1 = %s", str1);

  printf ("\nEnter str2: ");
  scanf (fmt, str2);
  printf ("\nstr2 = %s", str2);

  printf ("\nEnter str3: ");
  scanf (fmt, str3);
  printf ("\nstr2 = %s", str3);

  printf ("\n");

关于c - scanf: "%[^\n]"跳过第二个输入但 "%[^\n]"没有。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6083045/

相关文章:

c - 将 scanf 和 EOF 添加到程序中

c - 为什么子进程 "read"函数不返回(我觉得会返回-1),子进程 'printf'函数不起作用

c - 如何正确使用 fscanf 仅将需要的信息存储在数组中?

c - 如何读取文件直到某个字符或 EOF?

c - 当我为结构初始值设定项中的字符串数组成员赋值时,为什么会收到 "int-conversion"警告?

c - before 的期望表达式(C 编程语言)

c - 如何使用scanf读取文件中的每个单词。

c - 为什么scanf失败一次后不等待用户输入?

c - waitpid 没有给我一致的结果

c - 从二进制文件中删除