2017-08-09 49 views
0

我發現我的非常基本的小寫字符串代碼有時會輸出一個額外的字符。如果我運行的V @ genere有一些投入,它工作正常:「Vigenere」:String lowercasing program is appending character for some inputs

~/workspace/pset2/vigenere/ $ ./vigenere tweedDLed 
tweeddled 

但對於其他投入,它插入在最後一個多餘的字符:

~/workspace/pset2/vigenere/ $ ./vigenere tweedDLedf 
tweeddledfB 

或...

~/workspace/pset2/vigenere/ $ ./vigenere bkls33bf 
bkls33bfW 

這是怎麼回事?由於不顯示字符數組,因此我沒有找到任何與調試器相關的信息。這是我的代碼:

#include <ctype.h> 
#include <stdio.h> 
#include <string.h> 
#include <math.h> 
#include <cs50.h> 

int main(int argc, string argv[]){ 
    if (argc!=2){ 
     return 1; 
    } 
    else{ 

     int n = strlen(argv[1]); 
     char cipherKey[n]; 
     for (int i=0;i<n;i++){ 
      cipherKey[i]=tolower(argv[1][i]); 
     } 


     printf("%s\n",cipherKey); 


    } 
} 
+2

'的printf( 「%S \ n」,密碼索引)'>'printf的;' – BLUEPIXY

+0

它用零終止字符串是很好的。否則,我真的很驚訝,你只有一個字母更多印刷:) –

回答

2

您需要爲字符串終止字符分配空間,並且需要終止字符串。否則,可能會使字符串未終止,printf可能會讀出字符串的邊界,從而產生未定義的行爲(例如,以「weired」輸出形式)。可以按如下步驟糾正這一點; - ( 「%* S \ N」,N,密碼索引)

int n = strlen(argv[1]); 
    char cipherKey[n+1]; 
    for (int i=0;i<n;i++){ 
     cipherKey[i]=tolower((unsigned char)argv[1][i]); 
    } 
    cipherKey[n]='\0'; 
+0

非常感謝!我一整天都在爲此苦苦掙扎。 – AKD92929

+0

我可以將您的答案複製並粘貼到此主題中嗎? https://www.reddit.com/r/cs50/comments/6so665/vigenere_lowercasing_script_inserts_extra/ – AKD92929

+0

當然;隨時可以幫助其他人:-) –