2015-10-25 37 views
1

我得到這個代碼:確定是否*字符<INT_MAX

char a[151]; 
scanf ("%150s", a); 

a可能是一個號碼,如果是的話,我需要確定,如果a < INT_MAX。我不知道,怎麼做,因爲在a的每個索引中char可以是一個數字,這意味着150位數字,如果我將值存儲到某個int或其他任何地方,可能會導致溢出。有什麼建議麼?

+0

也許使用'INT *'和分配內存,但也許太多的內存分配。 – ameyCU

+1

'char a [150];'** - > **'char a [151];'。 – ameyCU

+0

爲什麼不是[150]?第一個字符有索引0還是我錯了? –

回答

0

一個解決辦法:

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 

[注:負數在這裏沒有考慮]

+1

如果'a =='2147483644''怎麼辦?而如果'INT_MAX'具有另一個值,它不應該是'INT32_MAX'。我的意思是它不能在32位電腦上運行 –

+0

注意:這種方法聲明像「00000000000001」這樣的輸入爲溢出。 – chux

+1

我同意這兩個輸入,它會失敗我的算法。 @chux,你建議的解決方案是好的。 – cm161

2

呼叫strtol()和測試errno

若正確的值是表示的值的範圍之外時,LONG_MINLONG_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` 
相關問題