scanf()行为不端

时间:2011-02-21 05:25:54

标签: c scanf

我有一个非常短的片段,读取整数:

#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);
        }
    }
}

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

我做错了什么?

3 个答案:

答案 0 :(得分:2)

使用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);
    }
}

希望这有帮助!

答案 1 :(得分:1)

听起来你没有清除输入缓冲区并且不断地扫描不正确的字符 见这里:
Scanf and loops

scanf not terminating

答案 2 :(得分:0)

手册页说

返回值      这些函数返回分配的输入项数。这可能比提供的少,甚至为零      匹配失败的事件。 零表示虽然有可用输入,但没有分配转换; typ-      这是由于输入字符无效,例如'%d'转换的字母字符。

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