2014-11-02 2 views
-1

그래서 C에서 수업을 들었고 연습 문제 중 하나는 암호화와 암호 해독 모두를 수행하는 시저 암호 프로그램을 프로그래밍하는 것이 었습니다. 그리고 입력이 "ab cd"이면 출력은 "de # fg"가되어야하지만 대신 "de? g?"가 출력됩니다. 내 추측에 의하면 스페이스 바가 모든 것을 엉망으로 만든다. 또한 "a"를 입력하고 "d? ad?"를 출력 할 때 또 다른 오류가 발견되었습니다. 미리 감사드립니다.C Caesar Cipher 오류 임의 문자열 출력

#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'에 후행 null 바이트를 절대로 추가하지 마십시오. – Barmar

+0

죄송합니다, C 프로그래밍에 대한 지식이 while 루프에서 끝나는 ... – user1885723

+0

C 클래스를 사용하고 있으며 C 문자열이'\ 0'으로 끝나야한다는 것을 결코 가르쳐주지 않았습니까? 왜 while 루프가 그것을 테스트하는 것일까? – Barmar

답변

0

scanf%s 연산자는 하나의 단어가 아니라 전체 라인을 읽습니다. 따라서 ab cd을 입력하면 abplain_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에 null 종결를 추가하지거야, 그래서 당신이 인코딩 된 문자 이후에 어떤 쓰레기 인쇄하고 있다는 점이다. 이 문제를 해결하는 가장 간단한 방법은 변수를 선언 할 때 변수를 모두 0 배열로 초기화하는 것입니다.

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

sooo sooo thank much !!!! – user1885723

관련 문제