我在尝试弄清楚如何使用 scanf()
时遇到了很多问题。它似乎可以很好地处理整数,相当简单 scanf("%d", &i)
。
我遇到问题的地方是在循环中使用 scanf()
尝试读取输入。例如:
do {
printf("counter: %d: ", counter);
scanf("%c %c%d", &command, &prefix, &input);
} while (command != 'q');
当我输入像
c P101
这样的有效结构化输入时,它似乎在提示我之前再次循环。即使只有一个,这似乎也会发生:scanf("%c", &c)
在 while 循环中。在再次提示我之前,它会循环两次。是什么让它循环两次,如何停止它?
当我输入的输入量较少,而以编程方式不会有其他字符或数字(例如
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/