C-检查scanf读取的int是否在整数范围内



我有一段代码,它使用scanf读取一个整数,并通过查看缓冲区来检查它是否真的是一个整数。

int e_1; 
char c[1];
// noNeedToCleanBuffer is used to avoid buffer cleaning the first time.
int noNeedToCleanBuffer = 1;
do {
    // Clears the buffer.
    if (!noNeedToCleanBuffer)
        while ((c[0] = getchar()) != 'n') ;
    noNeedToCleanBuffer = 0;
    printf("Input an integer value: n");
    e_1 = scanf("%d", &n);  
    c[0] = getchar();
} while ((e_1 != 1 && c[0] != 10) || (e_1 == 1 && c[0] != 10));

然而,我不知道如何检查输入是否在INT_MIN和INT_MAX之间(我从limites.h中得到这些)

我想把这个数字作为一个字符串,并将其与表示INT_MIN和INT_MAX的两个字符串进行比较,但由于我使用的是标准c99,所以不允许使用atoi()或itoa()。

如果你真的只想检查存储它-

1.)长期储存,然后检查

2.)将数字存储在字符串中,然后通过获取每个数字并存储在字符串,然后使用strcmp()将INT_MAX转换为字符串

num = INT_MAX;
i = 0;
while(num != 0){
    str[i] = num % 10;
    num = num / 10;
    i++;
}

这个字符串中的数字是相反的,你可以通过一个简单的循环很容易地将其反转

然后使用strcmp();

使用s转换说明符和scanf读取字符串,并使用strtol函数检查数字。

  • strtol允许您首先检查数字的格式是否正确(整数),以及它是否可以表示为long整数
  • 然后检查long编号是否在INT_MININT_MAX之间

任何给定数据类型(包括int)的变量的值都将始终在该数据类型的范围内。这是由编译应用程序的平台定义和实施的。

如果你只想进行一个"证明"变量在你的类型范围内的练习,你必须将它强制转换为一个可以容纳更大范围值的类型的变量。例如:

int foo = /* some value to test */;
long bar = (long)foo;
if ( (bar < (long)INT_MIN) || (bar > (long)INT_MAX) ) return false;

最新更新