【问题标题】:scanf() is getting skippedscanf() 被跳过
【发布时间】:2011-03-24 01:02:14
【问题描述】:

嗨 刚开始为uni学习c(通常使用objective 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");
    }
}

这我打印出“错误”然后要求输入(所以它第一次跳过了 scanf 语句)。如果我将它更改为另一个字符串变量,它可以正常工作,它会在第一次停止。

代码的其余部分工作正常,只是它一进入令人讨厌的循环就会打印一个错误。

我试过getChar(),它做同样的事情。

感谢您提供的任何帮助。

【问题讨论】:

  • 我没有跳过。但是,如果不是“L”,它会为我输入的每个字符打印一次“ERROR\n”。
  • 你能给我们完整的源代码吗?我认为在此处显示的代码之前调用了另一个输入函数,它将字符留在缓冲区中。

标签: c


【解决方案1】:

如果它在您第一次进入循环时打印错误,那么输入缓冲区中已经有东西了。我保证(假设你的编译器不是脑残)它不会跳过scanf。您应该通过更改来检查它实际收到的内容:

printf("ERROR\n");

到:

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

我建议它是您的程序上次运行该代码时的换行符(您说这是第一次,但不清楚您是否是指第一次进入该循环曾经(因为程序已启动)或第一次进入该循环,但您之前在此程序运行时已经通过它。

当您第一次输入 LENTER 时,您的代码将提取L,但不会提取ENTER。如果您再次调用该代码,它将获得ENTER 键。

您应该理解并允许实际输入的内容,或者使用安全可靠的输入功能,例如this one

【讨论】:

  • 谢谢,这是新行,已修复:computerType = getchar(); scanf("%c",&computerType); 现在可以正常工作了
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 添加空格字符会导致scanf 在阅读更多输入之前跳过空格(即空格、制表符、换行符)。如果格式中没有空格字符,%c 会从输入中读取下一个字符,无论是否有空格。
    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多