2016-11-01 3 views
-5

코드에 두 개의 파일이 있어야합니다. code.c는 stdin에서 디코딩하는 코드와 decode.c를 인코딩합니다. 각 줄의 길이를 120 자 이하로 가정하면 길이 파일 크기에 문제가 없어야합니다.이 C 코드가 메시지를 인코딩/디코딩하는 데있어 잘못된 점

내 인코딩 코드 ...

void encode(char pass[]) { 
    char buffer[121], encoded[121]; 
    int i = 0, j = 0; 

    while (fgets(buffer, 120, stdin)) { 
     for (i = 0; i < (strlen(buffer)); i++) { 
      if (j > (strlen(pass) - 1)) 
       j = 0; 

      encoded[i] = buffer[i] + pass[j]; 
      j++; 
     } 
     fprintf(stdout, encoded); 
    } 
    fprintf(stderr, buffer); 
} 

그리고 정확히 반대, 디코드 코드 :

void decode(char pass[]) { 
    char buffer[121], decoded[121]; 
    int i = 0, j = 0; 

    while (fgets(buffer, 120, stdin)) { 
     for (i = 0; i < (strlen(buffer)); i++) { 
      if (j > (strlen(pass) - 1)) 
       j = 0; 

      decoded[i] = buffer[i] - pass[j]; 
      j++; 
     } 
     fprintf(stdout, decoded); 
    } 
} 

코드가 인코딩 것으로 보인다 것을 제외하고, 실행하고 의도 한대로 거의 작동하는 것 같다 CTRL + D를 눌러 종료 할 때 마지막 행에 더 많은 데이터가 있습니다. 그래서 디코딩하려고 할 때 마지막 줄을 제외하고 제대로 디코딩됩니다.

편집 : 여기

는 '암호'

파일의 암호를 사용하여 파일 이름 토굴에

This is a test 
file that will contain 
encrypted information 

을 넣어해야합니다 몇 가지 예제 입력

code password > crypt 
This is a test 
file that will contain 
encrypted information 

입니다 토굴은 다음과 같습니다 :

01 23,516,
ÄÉÜæ<97>Øå<84>Ñ<81>çØêãÊÙÍØ<93>ë×ÓØ<90>ØÜßã<8f>ÕÓÞÕÔÜåy×ÒÓÓìãëÔÖ<84>ÙÏÙâéÜÓØÙÐá}y 

복호화 출력은 그러나 같습니다

decode password < crypt 
This is a test 
file that will contain 
encrypted information 
?? 

을 ?? 파일에서 가져 오는 가비지 텍스트입니다. 표준 입력에 입력 ..

입력의 또 다른 라운드가 인코딩 또는 디코딩 중이었다보다 더 이유는 확실하지/출력이 수행합니다

./code password > crypt 
testing this 
file to encrypt 
stuff 
./decode password < crypt 
testing this 
file to encrypt 
!J 

내 마지막 줄에서 일어나는 문제가 훨씬 더 분명 반면 .

+0

질문에 실제 출력 예제와 일부 예제 입력에 대한 예상 출력을 추가 할 수 있습니까? –

+0

일부 입력을 추가했습니다. – MaxLo

답변

1

주된 문제는 에 전달하기 전에 encoded 또는 decoded의 끝에 null 종결자를 넣지 않는 것입니다.

fprintfdecoded을 형식 문자열로 전달하면 안되며 %자를 포함하는 경우 정의되지 않은 동작이 호출됩니다. 당신이 여기에 줄에서 입력 한 라인을 읽는 유지하려면

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

void encode(const char pass[]) { 
    int c, i = 0, len = strlen(pass); 

    while ((c = getchar()) != EOF) { 
     putchar(c + pass[i++]); 
     if (i >= len) 
      i = 0; 
    } 
    fflush(stdout); 
} 

void decode(const char pass[]) { 
    int c, i = 0, len = strlen(pass); 

    while ((c = getchar()) != EOF) { 
     putchar(c - pass[i++]); 
     if (i >= len) 
      i = 0; 
    } 
    fflush(stdout); 
} 

다른 버퍼에 문자열을 복사하지 않는 코드의 단순화 된 버전입니다 : 여기

는 수정 및 단순화 된 버전입니다 따라서 null 종결를 저장할 필요가 없습니다 : 입력 파일이 암호에서 바이트를 추가하는 값 0을 생산하도록 널 바이트 문자가 포함 된 경우이 방법이 실패

void encode(char pass[]) { 
    char buffer[121]; 
    int i = 0, j = 0, len = strlen(pass); 

    while (fgets(buffer, sizeof buffer, stdin)) { 
     for (i = 0; buffer[i] != '\0'; i++) { 
      buffer[i] += pass[j++]; 
      if (j >= len) 
       j = 0; 
     } 
     printf("%s", buffer); 
    } 
} 

참고 그러나 것이다. 파일과 암호가 모두 ASCII 바이트 만 포함하는 것은 불가능하지만 이진 파일이나 외부 텍스트 파일을 시도하고 인코딩하면이 문제가 발생할 수 있습니다. getchar()의 간단한 버전에는이 문제가 없습니다.

+0

글쎄, 그것은 매력처럼 작동했습니다! 감사. – MaxLo

+0

호기심에서, 내 코드를 계속 사용하려면 fprintf에 전달하기 전에 끝에 null을 추가하는 방법은 무엇입니까? – MaxLo

+0

@MaxLo :'encode()'와'decoded [i] = '\ 0';에서'fprintf()'앞에'encoded [i] = '\ 0' fprintf()'에서'decode()' – chqrlie

1

인코딩 된 문자열을 형식 문자열로 fprintf에 전달합니다. 인코딩 된 문자열에 % 문자가 포함되어 있으면 fprintf을 명백한 치명적인 결과가있는 형식 지정자의 시작으로 해석하게됩니다. 형식 문자열로 임의의 문자열을 fprintf에 전달하지 마십시오. 당신이 fprintf에 임의의 문자열을 원하는 경우에,

fprintf(stdout, "%s", encoded); 

원래의 텍스트를 쉽게뿐만 아니라 % 문자를 포함 할 수 있으므로이, 당신의 기능을 모두 적용을한다.

또한 @chqrlie는 이미 언급했듯이 두 기능 중 하나에서 수신자 버퍼 (예 : encodeddecoded)를 0으로 종결하지 않습니다.

+0

또는 간단히'printf ("% s", encoded); ' – chqrlie

+0

고맙습니다. 내가 얻고있는 경고를 도왔지만, 여전히 쓰레기의 이상한 오류를 얻었습니다. ... – MaxLo

관련 문제