【问题标题】:scanf() misbehavingscanf() 行为不端
【发布时间】:2011-02-21 05:25:54
【问题描述】:

我有一个非常短的 sn-p,它读取一个整数:

#include <stdio.h>

int main() {
    while (1) {
        int i = 0;
        int r = scanf("%d", &i);

        if (r == EOF) {
            printf("Error using scanf()\n");
        } else if (r == 0) {
            printf("No number found\n");
        } else {
            printf("The number you typed in was %d\n", i);
        }
    }
}

但问题是,如果我输入任何字母,它只会不断循环并打印出“未找到数字”,而不是等待下一个输入。

我做错了什么?

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    在使用scanf 时,如果您尝试执行读取操作并且找到的数据与预期格式不匹配,scanf 会留下未知数据以供将来的读取操作提取。在这种情况下,发生的事情是您试图从用户那里读取格式化数据,用户的数据与您的预期格式不匹配,因此它无法读取任何内容。然后它循环尝试再次读取并找到与之前相同的违规输入,然后再次循环,等等。

    要解决此问题,您只需要使用混淆输入的字符即可。一种方法是调用fgetc 来读取字符,直到检测到换行符,这将刷新所有有问题的字符:

    while (1) {
        int i = 0;
        int r = scanf("%d", &i);
    
        if (r == EOF) {
            printf("Error using scanf()\n");
        } else if (r == 0) {
            printf("No number found\n");
    
            /* Consume bad input. */
            while (fgetc(stdin) != '\n')
                ;
    
        } else {
            printf("The number you typed in was %d\n", i);
        }
    }
    

    希望这会有所帮助!

    【讨论】:

    • 最好有一个无用的缓冲区来传递给fgets 的调用以完成该行。最好还是从一开始就使用fgets
    【解决方案2】:

    听起来您没有清除输入缓冲区,而是一遍又一遍地扫描不正确的字符。
    见这里:
    Scanf and loops

    scanf not terminating

    【讨论】:

      【解决方案3】:

      手册页说

      返回值 这些函数返回分配的输入项的数量。这可能比规定的要少,甚至为零。 匹配失败的事件。 零表示尽管有可用的输入,但没有分配转换;典型- 这通常是由于输入字符无效,例如用于“%d”转换的字母字符。

      由于您使用了 "%d" ,如果您使用任何数字,那么这将正常工作,否则它不会从缓冲区中消耗它

      【讨论】:

        猜你喜欢
        • 2015-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多