我在尝试弄清楚如何使用时遇到了很多问题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)
在一个循环中.在再次提示我之前,它会进行两次循环.是什么让它循环两次,我该如何阻止它?
当我输入较少量的输入时,以编程方式不会有其他字符或数字,例如q
,按Enter似乎提示我输入更多.如何scanf()
处理单字符和双字符条目?
Robert Gambl.. 20
当你输入" 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 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()进行解析.