2015-08-08 57 views
0

我使用字符的ASCII值來執行此操作:abs(string[j-1] - string[j])並將其存儲在整數數組'arraynum2'中。 ('字符串'可容納4個字符)爲什麼我的數組打印的數字與分配過程中打印的數字不同?

for(int j = length; j > 0; j--) { 
     int num = 0; 
     number2 = abs(string[j-1] - string[j]); 
     printf("second %d\n", number2); 
     arraynum2[num] = number2; 
     printf("second %d\n", arraynum2[num]); 
     num++; 
    } 

以上for循環打印正確的數字,如number2 == arraynum2[num]

但是,當我打印出來的下一個for循環,不同數量的印刷得到:

for(int k = 0; k < length; k++) { 
     printf("arraynum2 has: %d\n", arraynum2[k]); 
     /* 
     if(arraynum1[k] != arraynum2[k]) { 
      return 0; 
     } 
     */ 
    } 

例如,陣列應包含:122,2,21,2。 但在第二個for循環,它打印出:2,0673946096,32730.

有人可以解釋我做錯了什麼或我沒有看到?

+0

請發表一個小的,乾淨的編譯,顯示問題代碼。然後我們可以正確地幫助你。事實上,有幾個關鍵未公開的細節,例如:1)長度值2)字符串[]的定義。如果sizeof(字符串)等於length,則代碼訪問內存超出string []的末尾。 I.E.運行時問題需要可運行的代碼。 – user3629249

回答

1

在第一次循環中,您重新初始化num0,每次迭代。因此,每次只能分配第一個元素arraynum2[0]

初始化num你的第一個循環:

for (int j = length; j > 0; j--) { 
    int num = 0; 

或者:

for (int j = length, num = 0; j > 0; j--) { 
    int num = 0; 

而且,正如其他人所指出的那樣,指數length可能是您的字符串的邊界之外(你不顯示string的定義)。因此,您可能需要在索引length - 1處啓動您的循環。

+0

啊!謝謝,修正了這個問題:D – Ceria

+0

或者完全拋棄'num',只是使用'[length-j]'作爲數組下標,儘管我仍然同意tinky;不管怎樣,機會都會被超越。 – WhozCraig

2

最有可能你正在試圖讀出範圍

for(int j = length; j > 0; j--) { 
     int num = 0; 
     number2 = abs(string[j-1] - string[j]); 

觸發未定義行爲如果你string[]數組長度大小,像

int string[length]; 

定義,那麼最後一個指標是length - 1

此外,在第一循環中,您錯誤地分配給arraynum2,因爲你總是使用僅0指數:

int num = 0; 
number2 = abs(string[j-1] - string[j]); 
printf("second %d\n", number2); 
arraynum2[num] = number2; 
     ^
     // num is always 0 here 

SOLUTION:

檢查你不觸發UB和初始化num一次,在的初始化步驟中爲循環:

for(int j = length, num = 0; j > 0; j--) { 
     number2 = (...); 
     arraynum2[num] = number2; 
     num++; 
} 
+0

感謝您的幫助:D – Ceria

+0

歡迎您先生 – 4pie0

相關問題