在 c 中读入一个 int 并忽略其他任何内容

Read in an int in c and ignore anything else

我正在尝试使用 scanf() 读取一个 int 以用于以后的计算,但我试图让它丢弃 int 之后的任何内容。

本质上我希望能够提示用户回答诸如

这样的问题

3 + 5 是多少?

并且用户能够输入 8 或 8 dog 或任何具有这种性质的东西,并且它被同等对待。我曾尝试使用 scanf("%*[^\n]\n"); 但这会导致其他提示导致程序其他地方出现问题 无法正确显示。我还应该读入的值(在本例中为 8)用于其他计算,我需要删除狗部分,因为它也会在程序中引起问题。

用于澄清评论中问题的示例代码

printf("What is %d %c %d ", a, oper, b);
fgets(line, sizeof(line), stdin);
errno = 0;
num = strtol(line, NULL, 10);
if (num == answer)
    {
    printf("Correct!");
    right++;
    }
else
    {
    printf("Wrong!");
    }
printf("\n");

    if (errno != 0)
{
    printf("Invalid input, it must be just a number \n");
}

基本上这部分对用户输入的数学问题进行评分

尝试以这种方式读取输入时,使用 scanf 可能会很棘手。我建议使用 fgets 阅读整行,然后使用 strtol 将结果转换为数字。

char line[100];
long int num;
fgets(line,sizeof(line),stdin);
errno = 0;
num = strtol(line, NULL, 10);
if (errno != 0) {
    printf("%s is not a number!\n", line);
}

编辑:

你的内容看起来不错,尽管正如 chux 在评论中指出的那样,它没有正确检测到非数值。

应该这样做:

int main()
{
    int a, b, answer, right;;
    char oper, *p;
    char line[100];
    long int num;

    right=0;
    a=3, b=5, oper='+', answer=8;
    printf("What is %d %c %d ", a, oper, b);
    fgets(line, sizeof(line), stdin);
    errno = 0;
    num = strtol(line, &p, 10);    // p will point to the first invalid character
    if (num == answer)
    {
        printf("Correct!");
        right++;
    }
    else
    {
        printf("Wrong!");
    }
    printf("\n");

    if (errno != 0 || p == line)
    {
        printf("Invalid input, it must be just a number \n");
    }
}