读入c中的int并忽略其他任何内容

时间:2015-09-22 18:33:32

标签: c scanf

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

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

之类的问题

什么是3 + 5?

并且用户能够输入8或8只狗或任何具有该性质的东西,并且它们被视为相同。我尝试过使用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");
}

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

1 个答案:

答案 0 :(得分:2)

尝试以这种方式读取输入时,使用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");
    }
}