2017-08-09 47 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

当然;随时可以帮助其他人:-) –