嗨刚刚开始学习c for uni(通常使用目标c)并遇到一个与scanf有关的奇怪问题,我有以下代码
while(stringCheck == 0){ scanf("%c",&computerType); computerType = toupper(computerType); if ( computerType == 'L') { /*set stringCheck to 1 so the scanf while loop breaks*/ stringCheck = 1; counter = 0; } else { printf("ERRORn"); } }
我打印出“ERROR”然后要求输入(因此它第一次跳过scanf语句)。 如果我将它更改为另一个字符串变量,它可以正常工作,它会在第一次停止。
其余的代码工作正常,它只是在它进入烦人的循环时打印错误的事实。
我尝试过getChar()
并且它做了同样的事情。
感谢您提供的任何帮助。
如果它在您第一次进入循环时打印错误,那么输入缓冲区中已经存在某些内容。 我保证(假设您的编译器没有脑死亡)它没有跳过scanf
。 您应该通过更改来检查它实际接收的内容:
printf("ERRORn");
至:
printf("ERROR, code = %02xn", computerType);
我建议这是你上一次程序运行该代码时的换行符(你说这是第一次,但不清楚你是否意味着第一次进入该循环(自程序启动以来)或第一次进入该循环但是你在这个程序运行之前就已经完成了它。
当您第一次输入L ENTER时,您的代码将拉出L
而不是 ENTER
。 如果您再次调用该代码,它将获得ENTER
键。
您应该了解并允许实际输入的内容或使用像这样的安全和声音输入function。
你应该总是检查scanf()
的返回值; 它告诉你有多少转换成功了。 在这种情况下,如果你没有回到1,你就会遇到问题。 第一次循环, scanf()
读取一个字符 – 但不是一个ell( l
或L
),因为你说你得到一条错误信息。 下一次迭代尝试读取换行符或前一个错误字符后面的任何其他内容,换行符当然不是一个列,其他字符很可能也不是一个列,因此产生至少一个错误消息。 您将获得为每个非椭圆字符打印的错误。
通常,如果使用scanf()
,则很难从错误中恢复。 你可能最好将一行读入缓冲区(字符数组)并使用sscanf()
来解析它。
你应该只需要在%c
之前添加一个空格。 我不确定它为什么会起作用,但确实如此。 其他数据类型也会发生这种情况。
用scanf
替换scanf
语句scanf(" %c",&computerType);
以上就是c/c++开发分享scanf()被跳过了相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522372.html