2015-04-22 78 views
0

我編寫了一個循環,用一個引用數組替換另一個字符串中的每個字符。在迭代時更改數組值雖然會導致奇怪的行爲

for(int i=0 ; i < encoded_message_len ; i++){ 

    for(int j=0; j < 26 ; j++){ 

     if(encoded_message_copy[i] == substitution_alphabet[j]){ 

      printf("%c ->>>> %c @ index:%d \n",encoded_message_copy[i], original_alphabet[j], i); 
      encoded_message_copy[i] = original_alphabet[j]; 
     } 
    } 
} 

然而,當我運行這段代碼,我得到一個奇怪的輸出:

J ->>>> C @ index:0 
H ->>>> R @ index:1 
Q ->>>> Y @ index:2 
Y ->>>> Z @ index:2 
S ->>>> P @ index:3 
U ->>>> T @ index:4 
T ->>>> V @ index:4 
X ->>>> O @ index:6 
F ->>>> L @ index:7 
L ->>>> X @ index:7 
X ->>>> O @ index:8 
B ->>>> G @ index:9 
G ->>>> W @ index:9 
Q ->>>> Y @ index:10 
Y ->>>> Z @ index:10 

當我刪除此行:從環encoded_message_copy[i] = original_alphabet[j];,我得到的預期輸出:

J ->>>> C @ index:0 
H ->>>> R @ index:1 
Q ->>>> Y @ index:2 
S ->>>> P @ index:3 
U ->>>> T @ index:4 
X ->>>> O @ index:6 
F ->>>> L @ index:7 
X ->>>> O @ index:8 
B ->>>> G @ index:9 
Q ->>>> Y @ index:10 

有人可以解釋爲什麼會發生這種情況嗎?

+2

這裏缺少很多上下文。 –

+1

當您找到替代字符時,您不會跳出內部循環。結果,有時更新的字符在* substitution_alphabet中也被找到並被替換。在你的'if'語句的主體結尾放置一個'break'語句。 –

回答

1

將一個break;你需要刪除,使其正確的(內部的for循環)

你改變encoded_message_copy內容的行之後,這可能會導致語句if(encoded_message_copy[i] == substitution_alphabet[j])爲同一值相匹配多次i ;-)

1

您正在同一個位置上找到幾個符號。 當您找到它時,您需要跳過進一步查看第i個符號。 嘗試添加break

if(encoded_message_copy[i] == substitution_alphabet[j]) { 
    printf("%c ->>>> %c @ index:%d \n",encoded_message_copy[i], original_alphabet[j], i); 
    encoded_message_copy[i] = original_alphabet[j]; 
    break; 
} 
1

你改變你的數據 - 因此它被後來看到外環的早期迭代改變你的數據。

1

的問題是,當你使用的語句

 encoded_message_copy[i] = original_alphabet[j]; 

你不破環。

for(int j=0; j < 26 ; j++){ 

    if(encoded_message_copy[i] == substitution_alphabet[j]){ 

     printf("%c ->>>> %c @ index:%d \n",encoded_message_copy[i], original_alphabet[j], i); 
     encoded_message_copy[i] = original_alphabet[j]; 
    } 
} 

所以循環繼續比較新的替代字符與substitution_alphabet中的其他字符。

你應該打破循環,如果角色已經取代

for(int j=0; j < 26 ; j++){ 

    if(encoded_message_copy[i] == substitution_alphabet[j]){ 

     printf("%c ->>>> %c @ index:%d \n",encoded_message_copy[i], original_alphabet[j], i); 
     encoded_message_copy[i] = original_alphabet[j]; 
     break; 
    } 
} 
1
/* msg_ptr is the position within the encoded message */ 
/* letter is a numeric value which corresponds to letter of the 
    alphabet (0 maps to 'A', 1 => 'B', etc. */ 
for (int msg_ptr = 0 ; msg_ptr < message_len ; msg_ptr++) { 
    for (int letter = 0; letter < 26 ; letter++) { 
     if(encoded_message[msg_ptr] == substitution[letter]) { 
      encoded_message[msg_ptr] = original[letter]; 
     } 
    } 
} 

問題可能變得更清楚你現在。問題是,當您使用original[letter]中的值修改encoded_message[msg_ptr]時,內循環(字母for循環)旁邊是執行/增量。這意味着對於未更改的msg_ptr(i)和遞增的letter(j)值,再次進行比較。這意味着與encoded_message[msg_ptr]的新解碼值進行比較。

一旦成功找到,並在指定位置更換編碼的消息,你想提前到encoded_message數組中的下一個字符(即增加的msg_ptr(我的價值),這是可以做到使用breakkeyword

Another site先後爲break(和continue)語句,這可能更清楚一些程序運行圖。


如果你理解爲什麼這是必要的(或者換句話說嵌套循環如何運作)的問題上,精神上通過在你的腦袋下面的示例中運行,以及你的編譯器看到的。

for (int i = 0; i < 3; i++) { 
    for (int j = 0; j < 4; j++) { 
     printf("i=%d j=%d\n", i, j); 
    } 
} 

內環(j)默認將前外循環的下一次迭代完成i)發生。