2011-04-29 81 views
1

我一直在從幾個不同的角度攻擊atoi,試圖一次從字符串中提取一個數字。使用atoi

問題1 - 漿紗陣列
如果這種陣列的50個字符是尺寸爲50或51的(以考慮空終止)?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250"; 

問題2 - 的atoi輸出

我在做什麼錯在這裏?

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250"; 
int one = 0; 
char aChar = fiftyNumbersOne[48]; 
printf("%c\n",aChar);//outputs 5 (second to last #) 
one = atoi(&aChar); 
printf("%d\n",one);//outputs what appears to be INT_MAX...I want 5 

回答

7

問題1

數組應是長度爲51.但是,可以避免手動可以認識到這一點通過簡單地做char fiftyNumbersOne[] = "blahblahblah";

問題2

aChar不是指針原始字符串;它只是一個孤立的內存在某個地方浮動。但atoi(&aChar)正在將它視爲一個指向空終止字符串的指針。它只是遍歷內存,直到碰巧找到0的地方,然後解釋它被發現爲字符串的所有內容。

你可能想:

one = aChar - '0'; 

這依賴於一個事實,即09的字符值,保證是連續的。

+0

謝謝,這有很大的幫助。最後一個問題。爲什麼要得到我的字符串中的最後一個字符我需要使用索引49?我認爲這將是指數50 ...? – 2011-04-29 19:10:03

+1

@ P.Brian.Mackey,因爲數組在C中是從零開始的。第一個元素的索引爲0,第二個的索引爲1,第n個元素的索引爲n-1。 – rlibby 2011-04-29 19:14:32

+0

@ P.Brian:因爲數組是基於* 0的*,所以第一個元素是'x [0]',第二個元素是'x [1]',依此類推。 – 2011-04-29 19:14:49

1

問題1 - 漿紗陣列應該 此陣列的50個字符是尺寸爲50 或51的(佔空 終止子)?

您總是需要一個比您需要存儲的數組大一點的數組(以解釋空終止符)。所以你的50個字符應該存儲在一個大小爲51的數組中。

我在做什麼錯在這裏?

嘗試null將輸入字符串終止到atoi。文檔說atoi應該被賦予一個字符串的指針 - 這與一個非終止的單個字符不同。您發佈的當前代碼的結果在不同平臺上有所不同(我在unbuntu/gcc上得到-1)。

char fiftyNumbersOne[51] = "37107287533902102798797998220837590246510135740250"; 
int one = 0; 
char aChar = fiftyNumbersOne[48]; 
char intChar[2]; 
printf("%c\n",aChar);//outputs 5 (second to last #) 
sprintf(intChar, "%c", aChar); //print the char to a null terminated string 
one = atoi(&intChar); 
printf("%d\n",one);//outputs what appears to be INT_MAX...I want 5 
+0

1感謝您的另一種方法。 – 2011-04-29 19:20:01

3
  1. 這是因爲aChar是不是空終止。如果你只是想獲得一個char的整數值,只需使用

    one = aChar - '0'; 
    
0

如果這種陣列的50個字符是大小50或51(以佔空結束)?

51,但你也可以聲明它沒有大小。

char foo[] = "foo"; 

我在做什麼錯在這裏?

沒有閱讀有關atoi的文檔我想。 aCharchar,所以您將正確的類型傳遞給atoi,但atoi期望此類型表示一個字符串,通常由字符'\ 0'結尾。你的「字符串」沒有終止。

一種解決方法是

char aString[2]; 
aString[0] = fiftyNumbersOne[48]; 
aString[1] = '\0'; 
atoi(aString); 

另一個是做fiftyNumbersOne[48] - '0'而不是調用atoi,由於在ASCII十進制碼是連續的,並從0增加至9