阅读直到我设法输入一个整数

时间:2017-02-28 20:10:21

标签: c integer scanf

我在C中很新,我以前在Python工作,我试图看看我读的是否是整数。如果没有,请阅读,直到我设法输入一个号码。

我做了一些研究,我发现函数scanf实际上返回1,如果读取是适当的,否则为0。 所以,我已经编写了这段代码,而且我不明白为什么这是一个无限循环,编写"给出一个整数"在控制台上

#include <stdio.h>

int main() {
    int a;
    int b = 1;
    do {
        printf("Give an integer\n");
        b = scanf("%d", &a);
    } while (b == 0);
}

2 个答案:

答案 0 :(得分:2)

scanf()的问题在于,当"%d"等大多数说明符遇到第一个空格时,它会停止读取,所以它留在输入中,这就是为什么再次读取会导致问题的原因不要丢弃这样的空格,因为它会在您下次调用时立即返回。按 Enter 返回'\n'换行符(或换行符)时会引入强制性空白区域)。

如果你想读取一个整数并确定你做了,你可以试试这个

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int
main(void)
{
    long int value; // You can adapt this to use `int'
                    // but be careful with overflow
    char line[100];
    while (fgets(line, sizeof(line), stdin) != NULL) {
        char *endptr;
        value = strtol(line, &endptr, 10);
        if ((isspace(*endptr) != 0) && (endptr != line))
            break;
    }
    fprintf(stdout, "%ld\n", value);
    return 0;
}

阅读strtol()手册以了解此代码

您可以按照评论中的建议,从输入中删除空格字符,但是恕我直言,你仍然会遇到scanf()的其他问题,就像处理不直接的空输入一样。< / p>

答案 1 :(得分:1)

  

我不明白为什么这是一个无限循环,在控制台上写“给一个intiger”

问题是scanf()不会使用与指定格式无法匹配的数据。它会在输入流中保留未读取的此类字符。因此,如果您尝试使用相同的格式从同一个流中再次读取,而不通过其他方式消耗至少一个字符,那么您可以确定输入将再次不匹配。然后再次。再一次。

为避免无限循环,每次匹配失败后,您需要至少消耗一个不匹配输入的字符。有很多方法可以做到这一点;这是一个相当简单的:

#include <stdio.h>

int main() {
    int a;

    do {
        printf("Give an intiger\n");
        if (scanf("%d", &a)) {
            // breaks from the loop on a successful match or an error
            break;
        }
        // consume the remainder of one line of input without storing it
        if (scanf("%*[^\n]") == EOF) {
            break;
        }
    } while (1);
}

它消耗了遇到非匹配输入的行的整个剩余部分,这将为某些输入产生比许多替代方案更少的令人惊讶的交互行为。

如果您喜欢编写简洁代码,或者如果您不喜欢break在循环中间,那么您可能会写出相同的内容:

#include <stdio.h>

int main() {
    int a;

    do {
        printf("Give an intiger\n");
    } while ((scanf("%d", &a) == 0) && (scanf("%*[^\n]") != EOF));
}

由于&&运算符短路,第二次scanf()调用仅在第一次返回零时执行,并且循环将在第一次迭代后退出,其中第一次scanf() call返回非零值,或者第二个返回EOF(表示错误)。