2014-11-02 74 views
-1

所以我一直在C上課,其中一個練習是編程一個凱撒密碼程序,既加密和解密。當輸入是「ab cd」時,輸出應該是「de#fg」,而輸出「de?g?」。所以我的猜測是空間條把所有東西都弄亂了。但是,當我輸入「a」並輸出「d?ad?」時也發現了另一個錯誤。提前致謝。C凱撒密碼錯誤隨機字符串輸出

#include <stdio.h> 
#include <string.h> 

void cipher(char plain_str[], char cipher_str[]); 
void decipher(char cipher_str[], char decipher_str[]); 

int main() { 
    char plain_str[30]; 
    char cipher_str[30]; 
    char decipher_str[30]; 

    printf("Enter plain string: "); 
    scanf("%s", plain_str); 

    cipher(plain_str, cipher_str); 
    decipher(cipher_str, decipher_str); 
} 

void cipher(char plain_str[], char cipher_str[]) { 
    int i = 0; 

    while(plain_str[i] != '\0') { 
     if((plain_str[i]+3) >= 0 && (plain_str[i]+3) <= 127) { 
      cipher_str[i] = plain_str[i] + 3; 
     } else { 
      cipher_str[i] = plain_str[i] - 124; 
     } 
     i++; 
    } 
    printf("%s\n", cipher_str); 
} 

void decipher(char cipher_str[], char decipher_str[]) { 
    //asdf 
} 
+1

您從不將追尾空字節添加到'cipher_str'。 – Barmar 2014-11-02 07:08:53

+0

抱歉,我不明白,我的C編程知識在while循環處結束... – user1885723 2014-11-02 07:15:05

+0

您已經參加了C課程,他們從未教您C語言字符串必須以'\ 0'結尾?這不就是爲什麼'while'循環測試的嗎? – Barmar 2014-11-02 07:16:42

回答

0

%s運營商scanf只讀取一個字,而不是一整行。所以如果你輸入ab cd,只有ab被放入plain_str。要閱讀一整行,使用fgets()

fgets(plain_str, sizeof(plain_str), stdin); 
size_t len = strlen(plain_str); 
if (plain_str[len-1] == '\n') { 
    plain_str[len-1] = '\0'; // Remove newline 
} 

另一個問題是,你永遠不會添加空終結於cipher_str,讓你打印任何垃圾是在它編碼的字符之後。解決此問題的最簡單方法是在聲明變量時將其初始化爲全零數組:

char cipher_str[30] = {0}; 
+0

謝謝sooo多!!!! – user1885723 2014-11-02 15:18:56