我得到這個代碼:確定是否*字符<INT_MAX
char a[151];
scanf ("%150s", a);
在a
可能是一個號碼,如果是的話,我需要確定,如果a < INT_MAX
。我不知道,怎麼做,因爲在a
的每個索引中char可以是一個數字,這意味着150位數字,如果我將值存儲到某個int或其他任何地方,可能會導致溢出。有什麼建議麼?
我得到這個代碼:確定是否*字符<INT_MAX
char a[151];
scanf ("%150s", a);
在a
可能是一個號碼,如果是的話,我需要確定,如果a < INT_MAX
。我不知道,怎麼做,因爲在a
的每個索引中char可以是一個數字,這意味着150位數字,如果我將值存儲到某個int或其他任何地方,可能會導致溢出。有什麼建議麼?
一個解決辦法:
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
[注:負數在這裏沒有考慮]
呼叫strtol()
和測試errno
。
若正確的值是表示的值的範圍之外時,
LONG_MIN
,LONG_MAX
,...宏ERANGE
的值被存儲在errno
。 C11dr§7.22.1.48
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`
也許使用'INT *'和分配內存,但也許太多的內存分配。 – ameyCU
'char a [150];'** - > **'char a [151];'。 – ameyCU
爲什麼不是[150]?第一個字符有索引0還是我錯了? –