在循环中跳过Scanf,导致无限循环

时间:2016-02-23 17:28:53

标签: c while-loop scanf

如果用户在请求用户再次尝试时输入格式错误的输入,则该代码的目的是这样的。出于某种原因,虽然在我的代码中,scanf在第一次迭代后不断被跳过,导致无限循环

#include <stdio.h>
int main() {
double A1;
int n1, loopchck, i=0;
while (i==0) {
    printf("Enter a real number and inerger (A n): ");
    fflush(stdin);
    loopchck=scanf_s(" %lf %d", &A1, &n1);
    if (loopchck == 2) {
        i = 1;
    }
    else {
        i = 0;
    } 
} 
return 0;
}

1 个答案:

答案 0 :(得分:0)

首先,让我们考虑一下您希望fflush(stdin);做什么。 fflush仅对已写入的流进行操作;它导致任何未写入(缓存)的数据被完全写入,并且在stdin的上下文中没有任何意义。

这是一个常见的错误。当你告诉scanf读取整数(或浮点数等)时,它会在不再看到任何数字时停止读取。这意味着你可能至少在流上有一个剩余的'\n'。用户可能还输入了您要丢弃的其他(错误)输入。

丢弃用户输入的想法太可怕了!您应该考虑以不同的形式接受输入(例如,使用argv中的int main(int argc, char **argv)),让他们的不舒服的生活更舒适。

如果您不能这样做(或者您不想这样做),您可以使用以下代码之一来放弃(包括)下一个'\n'

void fdiscardline(FILE *f) {
    int c;
    do {
        c = fgetc(f);
    } while (c != EOF && c != '\n');
}

void fdiscardline(FILE *f) {
    fscanf(f, "%*[^\n]");
    fgetc(f);
}

您应该在输入之后使用此,而不是之前的。此外,您需要考虑i应该是什么。如果可以读取更多输入(例如while (i==0)),它应该为零,或者当输入未正确读取时为零吗?你需要保持一致,因为这是你的循环终止条件。例如:

#include <stdio.h>
int main() {
    double A1;
    int n1, loopchck, i=0;
    while (i==0) {
        printf("Enter a real number and inerger (A n): ");
        loopchck=scanf_s(" %lf %d", &A1, &n1);
        fdiscardline(stdin);
        if (loopchck == 2) {
            i = 0;
        }
        else {
            i = 1;
        }
    } 
    return 0;
}