scanf()被跳过了

嗨刚刚开始学习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()并且它做了同样的事情。

感谢您提供的任何帮助。

如果它在您第一次进入循环时打印错误,那么输入缓冲区中已经存在某些内容。 我保证(假设您的编译器没有脑死亡)它没有跳过scanf 。 您应该通过更改来检查它实际接收的内容:

 printf("ERROR\n"); 

至:

 printf("ERROR, code = %02x\n", computerType); 

我建议这是你上一次程序运行该代码时的换行符(你说这是第一次,但不清楚你是否意味着第一次进入该循环(自程序启动以来)或第一次进入该循环但是你在这个程序运行之前就已经完成了它。

当您第一次输入L ENTER时,您的代码将拉出L不是 ENTER 。 如果您再次调用该代码,它将获得ENTER键。

您应该了解并允许实际输入的内容或使用像这样的安全和声音输入function。

你应该总是检查scanf()的返回值; 它告诉你有多少转换成功了。 在这种情况下,如果你没有回到1,你就会遇到问题。 第一次循环, scanf()读取一个字符 – 但不是一个ell( lL ),因为你说你得到一条错误信息。 下一次迭代尝试读取换行符或前一个错误字符后面的任何其他内容,换行符当然不是一个列,其他字符很可能也不是一个列,因此产生至少一个错误消息。 您将获得为每个非椭圆字符打印的错误。

通常,如果使用scanf() ,则很难从错误中恢复。 你可能最好将一行读入缓冲区(字符数组)并使用sscanf()来解析它。

你应该只需要在%c之前添加一个空格。 我不确定它为什么会起作用,但确实如此。 其他数据类型也会发生这种情况。

scanf替换scanf语句scanf(" %c",&computerType);