2014-11-02 2 views
-1

Итак, я занимался классами на C, и одним из упражнений было программирование программы шифрования цезаря, которая шифрует и расшифровывает. И когда вход «ab cd», выход должен быть «de # fg», но вместо этого он выводит «de? G?». Поэтому я предполагаю, что пробел все в порядке. Но также была обнаружена еще одна ошибка, когда я ввел «a» и вывел «d? Ad?». Заранее спасибо.C Caesar Cipher error random string output

#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

+0

Извините, я не понимаю, мои знания программирования C заканчиваются на петлях ... – user1885723

+0

Вы принимаете класс C, и они никогда не учили вас, что строки C должны заканчиваться символом '\ 0'? Разве это не значит, что цикл while? – Barmar

ответ

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

Спасибо, что так много !!!! – user1885723