2017-05-19 367 views
-4

我知道這可能是一個非常初學者的問題,但我幾個小時一直在反駁它。任何提示將不勝感激。將字符數組轉換爲整數

我得到一個以null結尾的字符串。我試圖用C和strtol將它轉換爲整數,這很好地工作,直到NULL之前的最後一個字符是/ n。我不確定如何讓strtol在該角色之前停下來。

轉換代碼:

char *end; 
arr[0] = strtol(temps, &end, 10); 
for(int i = 1; i < n - 1; i++){ 
    arr[i] = strtol(end, &end, 10); 
} 
arr[n] = strtol(end, NULL, 10); 

輸入:

49 32 45 50 32 45 56 32 52 32 53 10 // ascii values 

預期輸出:

1 -2 -8 4 5 // character array 

輸出:

1 -2 -8 4 1 // int array 

謝謝你的幫助。

+0

解釋什麼是你認爲是錯的程序。在程序中包含示例不正確的輸出。解釋它是如何獲得的(你的代碼片段沒有任何I/O函數)。** NB **:你確定要將'end'作爲第一個參數傳遞給'strtol'嗎? – DyZ

+0

嗨,對不起,int數組輸出是不正確的輸出。它應該輸出一個5,但它輸出一個1. 我想也許我不理解str_end參數,以使它明白它應該停在\ n。我相信第一個目標是正確的。我只是覺得最後一個NULL是不正確的。 對於I/O,它給了我由ascii值輸出指定的字符數組temps [](我沒有包含NULL終止符,但它在那裏)。我需要將它轉換爲int數組, – MushinZero

+0

發佈'arr []'的定義。 – chux

回答

0

該行可能寫出數組邊界:

arr[n] = strtol(end, NULL, 10); 

在任何情況下,這應該是arr[n-1],因爲分配給最後一個指數爲n-2。但邏輯可以被簡化,使得代碼到這樣的錯誤不敏感:

char *end; 
arr[0] = strtol(temps, &end, 10); 
for(int i = 1; i < n; i++){ 
    arr[i] = strtol(end, &end, 10); 
} 

或者還進一步簡化爲:

char *end = temps; 
for(int i = 0; i < n; i++){ 
    arr[i] = strtol(end, &end, 10); 
} 
+0

謝謝,我感到很傻。 strtol默認包含\ n作爲其中一個結束字符嗎? – MushinZero

+0

@ MushinZero--不完全; ['strtol()'](http://port70.net/~nsz/c/c11/n1570.html#7.22.1.4p2)基本上會跳過前導空格字符,並嘗試將其轉換爲第一個非數字字符,取決於指定的基礎。 –

+0

@ MushinZero--對於我說'strtol()'試圖轉換成第一個不被認爲是數字的一部分的字符會更準確。當然,'-'和'+'可能是也可能不是數字的一部分; 'x'或'X'也可以是十六進制數的一部分。 'strtol()'可以處理這些情況。如果基址被指定爲0,則strtol()會嘗試將該字符串解釋爲一個整數常量,即十進制,八進制(0nnn ...)或十六進制(0xnnn ...或0Xnnn .. )。 –