c - 在C中使用scanf解析输入

标签 c scanf

我在尝试弄清楚如何使用 scanf() 时遇到了很多问题。它似乎可以很好地处理整数,相当简单 scanf("%d", &i)

我遇到问题的地方是在循环中使用 scanf() 尝试读取输入。例如:

do {
  printf("counter: %d: ", counter);
  scanf("%c %c%d", &command, &prefix, &input);
} while (command != 'q');
  1. 当我输入像 c P101 这样的有效结构化输入时,它似乎在提示我之前再次循环。即使只有一个,这似乎也会发生:

    scanf("%c", &c) 
    

    在 while 循环中。在再次提示我之前,它会循环两次。是什么让它循环两次,如何停止它?

  2. 当我输入的输入量较少,而以编程方式不会有其他字符或数字(例如 q)时,按 Enter 似乎会提示我输入更多内容。如何让 scanf() 处理单字符和双字符输入?

最佳答案

当您输入“c P101 ”时,程序实际上接收到“c P101\n ”。大多数转换说明符都会跳过前导空格,包括换行符,但 %c才不是。第一次读取“\n”之前的所有内容,第二次将“\n”读取到command。 ,“c”被读入prefix ,并且留下的“P”不是数字,因此转换失败并且“P101\n”留在流中。下次将“P”存储到命令中时,“1”存储到前缀中,并且1 (来自剩余的“01”)被存储到输入中,“\n”仍然在流上以供下次使用。您可以通过在格式字符串的开头放置一个空格来解决此问题,这将跳过任何前导空格,包括换行符。

第二种情况也发生类似的情况,当您输入“q”时,“q\n”被输入到流中,第一次围绕“q”被读取,第二次“\n”被读取,只有在第三次调用时才会读取第二个“q”,您可以通过在格式字符串的开头添加空格字符来再次避免该问题。

更好的方法是使用 fgets() 之类的方法一次处理一行,然后使用 sscanf() 进行解析。

关于c - 在C中使用scanf解析输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602184/

相关文章:

不使用 C 库函数比较 2 个字符串

c - 如何在C中检测Char中的空格和字母?

c - 使用fgetc逐行读取不起作用

c - 如何根据条件语句和 C 输出来修复程序的运行?

c - 无休止的 while 循环和 fscanf 不将数据分配给结构

c - 什么时候使用 &?

c - win32api函数的顺序导致回调函数接收相同的消息

c - 转到 C 中二进制文件的某个点(使用 fseek),然后从该位置读取(使用 fread)

c - 在这个用 C 编写的 super 简单的程序中,不会让我读取 "char"类型的变量?

c - fgets() 在 fscanf() 之后不起作用