0

初学者程序员在这里学习C

我的部分代码要求用户输入数字,并将进入 while 循环以检查输入的值是否为数字,如果不是,则 while 循环将清除输入(以停止无限循环),并要求输入数字再次。

问题是,当我清除输入然后在 while 循环中再次请求 scanf() 时,它显然清除了两次,我必须再次输入数字才能获得结果。

这是有问题的代码的一部分:

int askNum()
{
    int number;
    int check;

    printf("Enter a number: ");
    check = scanf("%d", &number);

    while(scanf("%d", &number) != 1)
    {
        printf("You've entered an incorrect number.\nEnter a number: ");
        fflush(stdin);
        check = scanf("%d", &number);
    }    
    return number;
}

如果有人可以解释为什么会这样,请解释或给我一些关于如何继续的提示。

太感谢了!

4

2 回答 2

3

因为你的 while() 是错误的。

此外, fflush() 仅针对输出流定义。如果你想要可移植的代码,你应该这样做:

void fpurge(FILE *pf)
{
    int c;
    while((c=fgetc(pf)) != '\n' && c != EOF)
    { }
}

它将可靠地读取字符直到行尾。

于 2014-05-29T20:09:41.653 回答
3

fflush(stdin)不是由 C 标准定义的。这意味着不同的编译器可能会用它做不同的事情。我的只是完全忽略它。很难说你的编译器在做什么,或者为什么会发生奇怪的事情。

要从您的程序中获得可靠的行为,请坚持使用标准代码。

您的循环结构是正确的,但是fflush(stdin)应该用一些代码替换以读取和丢弃到目前为止已输入的所有字符。由于stdin默认情况下是行缓冲的,这意味着您需要继续阅读,直到您遇到换行符然后停止;那么事情就会为另一个做好准备scanf("%d"

有多种方法可以实际编码;梅迪诺克的答案是一个;另一个是 的[说明符scanf。如果发生 EOF,您还需要退出循环。(否则,如果输入流关闭,您将进入无限循环)。

于 2014-05-29T23:18:03.530 回答