首页 > 解决方案 > 如何在 scanf 时检查你只得到整数(如 2)而不是整数后跟字符(如 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;
    }

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

标签: cscanf

解决方案


如果您输入“仅一个字符”,它不会“自动将其转换为整数”。它根本不接受任何输入,如 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

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

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


推荐阅读