我得到了这个代码:
char a[151];
scanf ("%150s", a);
在a
中可以是一个数字,如果是,我需要确定,如果a < INT_MAX
。我不知道怎么做,因为在a
char的每个索引中可以是一个数字,它意味着150位数字,如果我将一个值存储到int或其他任何东西中,可能会导致溢出。有什么建议吗?
呼叫strtol()
,测试errno
如果正确的值在可表示值范围之外,则
LONG_MIN
,LONG_MAX
,…宏ERANGE
的值存储在errno
中。C11dr§7.22.1.4 8
char a[151];
scanf ("%150s", a);
char *endptr;
errno = 0;
long num = strtol(a, &endptr, 10);
if (errno == ERANGE) Overflow(); // outside `long` range
if (num > INT_MAX) Overflow(); // greater than `INT_MAX`
一种解决方法:
1. INT_MAX = 2147483647 --> contains 10 digits
2. len = strlen(a);
3. if (len > 10)
a. true --> then a > INT_MAX --> print answer and return
b. false, go to step 4
4. if (len < 10)
a. true --> then a < INT_MAX --> print answer and return
b. false, go to step 5
5. (len == 10) case
6. if (a[9]-'0' > 2) // 10th digit is > 2
a. true --> then a > INT_MAX --> print answer and return
b. false, go to step 7
7. int num = atoi(a);
9. Compare num and INT_MAX and print answer and return
[注:这里不考虑负数]