如何检查何时scanf仅得到整数(如2)而不是整数后跟char(如2c)

我正在尝试扫描一个整数以查看其在程序中是否合法。但是,如果我输入的数字后跟一个字符,它仍会将其视为合法数字(我的猜测是,在将字符保存在缓冲区中时,它仅引用整数)。假设我只能使用scanf,而不能使用其他任何东西(因为这是我们精益求精的目的)。另外,如果我仅输入一个字符,它将自动将其转换为整数。到目前为止,这是我在这里所看到的尝试-

 int number_of_numbers;
 char number='\n';
 printf("Enter size of input:");
 if (scanf("%d%c",&number_of_numbers,&number)>=1 && number!='\n')
    {
        printf("Invalid size");
        return 0;
    }

当我仅扫描一个整数或一个整数后跟一个字符或一个字符时,如何识别? 谢谢!

nnaxi 回答:如何检查何时scanf仅得到整数(如2)而不是整数后跟char(如2c)

如果输入“仅字符”,则不会“自动将其转换为整数”。它完全不接受任何输入,如scanf返回0所示,但是这种情况使您无法进行测试。

但是您的问题的答案是:使用scanf困难

这是一种通过fgets获取输入的方法。它可以容忍数字前后的空白,但不能容忍任何字母。

%c前留空格的原因是指示它过滤所有前导空格。无论如何,%d都是自动的,但%c则不是自动的。然后,如果没有可读字符,则不会将任何内容读入extra。如果至少有一个字符(空格除外),则sscanf转换计数将是错误的。

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int number_of_numbers = 0;
    while(number_of_numbers >= 0) {
        bool success = false;
        char str[100];
        if(fgets(str,sizeof str,stdin) != NULL) {
            char extra;
            if(sscanf(str,"%d %c",&number_of_numbers,&extra) == 1) {
                success = true;
            }
        }
        if(success) {
            printf("Success: %d\n\n",number_of_numbers);
        } else {
            printf("Invalid size\n\n");
        }
    }
    return 0;
}

计划会议:

123
Success: 123

123a
Invalid size

123 a
Invalid size

123 9
Invalid size

a
Invalid size

-1
Success: -1

使用fgets的原因是

  • 如果输入无效,它不会“停顿”:它已经被读取。

  • 如果有错误,可以很容易地将字符串转储并请求另一个。

本文链接:https://www.f2er.com/3150329.html

大家都在问