c - scanf 不等待输入就返回 0

标签 c scanf stdin

我从来没有用 C 编程,今天我必须编写一些小代码。程序非常简单 - 我想将两个整数相加。 但是当我试图检查给定的输入是否是数字并且第一个 scanf 返回 0 时,第二个 scanf 也返回 0 而无需等待输入。 代码:

int main()
{
    int a = 0;
    int b = 0;
    printf("Number a:\n");
    if (scanf("%d", &a) != 1)
    {
        printf("Not a number. a=0!\n");
        a = 0;
    }
    printf("Number b:\n");
    if (scanf("%d", &b) != 1)
    {
        printf("Not a number. b=0!\n");
        b = 0;
    }
    printf("%d\n", a+b);
    return 0;
}

最佳答案

第一个 fscanf() 未能转换为数字的输入仍在标准输入缓冲区中等待,并导致第二个 fscanf() 失败。尝试丢弃有问题的输入并重新提示用户:

#include <stdio.h>

int main(void) {
    int a = 0;
    int b = 0;
    int c;
    printf("Number a:\n");
    while (scanf("%d", &a) != 1) {
        printf("Not a number, try again:\n");
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (c == EOF)
            exit(1);
    }
    printf("Number b:\n");
    while (scanf("%d", &b) != 1) {
        printf("Not a number, try again:\n");
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (c == EOF)
            exit(1);
    }
    printf("%d\n", a + b);
    return 0;
}

使用实用函数分解代码使其更加清晰:

#include <stdio.h>

int get_number(const char *prompt, int *valp) {
    printf("%s:\n", prompt);
    while (scanf("%d", valp) != 1) {
        printf("Not a number, try again:\n");
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (c == EOF)
            return 0;
    }
    return 1;
}

int main(void) {
    int a, b;

    if (!get_number("Number a", &a) || !get_number("Number b", &b)) {
         return 1;
    }
    printf("%d\n", a + b);
    return 0;
}

关于c - scanf 不等待输入就返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40514969/

相关文章:

c - char 字符串数组元素的大小是多少?

c - 从 C 文件中解析 double

javascript - process.stdin 流的可读事件和数据事件有什么区别?

c - 如何在 C 中使用 EOF 标准输入

c++ - 具有 SOAP 请求/响应支持的最佳 XML 解析器

c - String 只记录第一个字

c - 调试远程 C 应用程序

c - 当我给 scanf() 一个非数字作为输入时,如何继续循环?

c - 将 fscanf/sscanf 字符串传递到结构字段 char[4]

c - 在下面的代码中刷新标准输入缓冲区时不知道哪里出了问题