scanf()被跳过了

时间:2011-03-24 01:02:15

标签: c

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

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:3)

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

printf("ERROR\n");

为:

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

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

第一次输入 L ENTER 时,您的代码将提取L {{1 }}。如果您再次调用该代码,它将获得ENTER密钥。

您应该了解并允许实际输入的内容或使用安全和声音输入功能,如this one

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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