死循环,也许它就是scanf

时间:2016-01-17 22:55:49

标签: c loops scanf

scanf("%d", &jogadores[pos].dados[4][2]);
while (jogadores[pos].dados[4][2] < 0) {
    printf("O valor não pode ser menor que 0, introduz novamente: ");
    scanf("%d", &jogadores[pos].dados[4][2]);
};

你知道这段代码有什么问题,我认为它会跳过第一个scanf,因为它会一直打印O valor não pode ser menor que 0, introduz novamente:

1 个答案:

答案 0 :(得分:2)

通过检查输出变量,无法检查scanf成功解析输入,您必须将返回值与预期的数字转换进行比较。此外,如果转换失败,违规字符将保留在输入流中,因此再次调用scanf而不先读取它们将再次失败,并再次失败......

以下是修复代码的方法:

for (;;) {
    if (scanf("%d", &jogadores[pos].dados[4][2]) != 1) {
        int c;
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (c == EOF) {
            printf("unexpected end of file\n");
            exit(EXIT_FAIL);
        }
        printf("invalid input, try again (non falo brasileiro)\n");
        continue;
    }
    if (jogadores[pos].dados[4][2] < 0) {
        printf("O valor não pode ser menor que 0, introduz novamente: ");
        continue;
    }
    break;
}