C,不同的GCC,fflush()不工作?

时间:2013-04-02 11:10:00

标签: c gcc stdin fflush

我是初学程序员。我有一个不允许输入浮点数或字符的函数。它与gcc 3.4.2一起工作正常,但现在我更新到4.7.1并且它无法正常工作。它现在仅适用于第一个输入a [0]。如果我输入让我们说'x',它将显示“错误的输入”,但是如果我输入例如'1'表示[0],然后输入'x'表示[1],它仍会说输入OK和将“1”分配给[1];我怎样才能解决这个问题?谢谢!

void initArray(unsigned int a[]) {

double q;
int x, c;

for ( x = 0; x < SIZE; x++){
    printf("a[%d] ", x);
    printf("Enter number: ");

    scanf("%lf", &q);

    if (q == (unsigned int) q) {
        printf("Input OK.\n");
        a[x] = q;
        fflush(stdin);
    }
    else {
        printf("Wrong Input\n");
        fflush(stdin);
        x--;
    }
}
printf("\n");
} 

2 个答案:

答案 0 :(得分:3)

您应该检查scanf的返回值。它返回它设置为“扫描”的项目数,如果它无法扫描任何内容,它将为零,例如当您输入'x'时:

if (scanf("%lf", &q) == 1)
{
    printf("Input OK.\n");
    a[x] = q;
}
else
{
    printf("Wrong Input\n");
    x--;
}

答案 1 :(得分:0)

我建议你替换

scanf("%lf", &q);

while ((c=(scanf(" %lf%c", &q, &tmp) !=2 || !isspace(tmp)))
       || (q != (unsigned int) q)) {
    printf("Your input is invalid please enter again: ");
    if(c) scanf("%*[^\n]");
}

scanf("%*[^\n]");清除您的标准输入,因此您的代码中不再需要fflush(stdin)

所以你的代码可能是:

void initArray(unsigned int a[]) {

double q;
int x, c=0;
char tmp;


for ( x = 0; x < SIZE; x++){
    printf("a[%d] ", x);
    printf("Enter number: ");

    while ( (c=(scanf(" %lf%c", &q, &tmp) !=2 || !isspace(tmp)))
               || (q != (unsigned int) q)) {
       printf("Your input is invalid please enter again: ");
       if(c) scanf("%*[^\n]");
    }

    a[x] = q;
}
printf("\n");
}