您好 刚开始学习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("ERROR\n");
}
}
这个我打印出“ERROR”然后要求输入(所以它第一次跳过scanf语句)。如果我将它更改为另一个字符串变量,它可以正常工作,它会在第一次停止。
其余的代码工作得很好,只是它一进入循环就会出现错误。
我尝试了getChar()
并且它也做了同样的事情。
感谢您提供任何帮助。
答案 0 :(得分:3)
如果在第一次进入循环时打印错误,则输入缓冲区中已存在某些内容。我保证(假设您的编译器没有脑死亡)它没有跳过scanf
。你应该通过改变来检查它实际收到的内容:
printf("ERROR\n");
为:
printf("ERROR, code = %02x\n", computerType);
我建议这是你上一次程序运行该代码时的换行符(你说这是第一次,但不清楚你是否第一次进入该循环曾经(从那以后)程序启动)或第一次进入该循环但你在此程序运行之前已经完成了它。
第一次输入 L ENTER 时,您的代码将提取L
但不 {{1 }}。如果您再次调用该代码,它将获得ENTER
密钥。
您应该了解并允许实际输入的内容或使用安全和声音输入功能,如this one。
答案 1 :(得分:2)
您应该始终检查scanf()
的返回值;它告诉你有多少转换成功了。在这种情况下,如果你没有回到1,你就会遇到问题。第一次围绕循环,scanf()
读取一个字符 - 但不是一个(l
或L
),因为您说您收到错误消息。下一次迭代尝试读取换行符或前一个错误字符后面的任何其他内容,并且换行符肯定不是一个列,而其他字符很可能也不是一个列,因此产生至少一个错误消息。您将收到为每个非椭圆字符打印的错误。
通常,如果您使用scanf()
,则很难从错误中恢复。将一行读入缓冲区(字符数组)并使用sscanf()
解析它可能会更好。
答案 2 :(得分:1)
您应该只需要在%c
之前添加空格。我不确定它为什么会起作用,但确实如此。其他数据类型也会发生这种情况。
将scanf
语句替换为scanf(" %c",&computerType);