当前位置:  开发笔记 > 编程语言 > 正文

使用C中的scanf解析输入

如何解决《使用C中的scanf解析输入》经验,为你挑选了1个好方法。

我在尝试弄清楚如何使用时遇到了很多问题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()进行解析.



1> Robert Gambl..:

当你输入" 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()进行解析.


很好的解释,我怀疑它一定是在阅读\n,但这肯定很复杂,我认为是一个简单的解析.我将研究fgets和sscanf().
推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有