2014-04-28 2 views
-1
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 


void encrypting(char cipher[25], int shift, int num) 
{ 
    int i; 
    for (i = 0; i < num; i++) 
    { 
     if (cipher[i] >= 'A' && cipher[i] <= 'Z') 
     { 
      cipher[i] = (char)(((cipher[i] + shift - 'A' + 26) % 26) + 'A'); 
     } 
     else if (cipher[i] >= 'a' && cipher[i] <= 'z') 
     { 
      cipher[i] = (char)(((cipher[i] + shift - 'a' + 26) % 26) + 'a'); 
     } 
    } 
} 

void decrypting(char cipher[25], int shift, int num) 
{ 
    inti; 
    for (i = 0; i < num; i++) 
    { 
     if (cipher[i] >= 'A' && cipher[i] <= 'Z') 
     { 
      cipher[i] = (char)(((cipher[i] - shift - 'A' + 26) % 26) + 'A'); 
     } 
     else if (cipher[i] >= 'a' && cipher[i] <= 'z') 
     { 
      cipher[i] = (char)(((cipher[i] - shift - 'a' + 26) % 26) + 'a'); 
     } 
    } 
} 

int main() 
{ 
    char text[10]; 
    static const char encrypt[] = "2"; 
    static const char decrypt[] = "1"; 
    int shift; 
    char cipher[25]; 
    int result1; 
    int result2; 
    int num; 
    int i; 



    printf("Enter operation: encrypt or decrypt/n"); 
    printf("Press 1 to Encrypt or 2 to Decrypt"); 
    scanf("%c", &text); 
    printf("Enter shift key"); 
    scanf("%d", &shift); 
    printf("Enter text to encrypt/decrypt"); 
    fflush(stdin); 
    scanf("%c", &cipher); 

    num = strlen(cipher); 

    result1 = strcmp(text, encrypt); 
    result2 = strcmp(text, decrypt); 

    if (result1 == 0) 
    { 
     decrypting(cipher, shift, num); 
    } 
    else { exit(0); } 

    if (result2 == 0) 
    { 
     encrypting(cipher, shift, num); 
    } 
    else { exit(0); } 

    printf("Result"); 
    printf("%d", cipher); 
} 

사용자가 암호 텍스트를 입력하면 프로그램이 예기치 않게 종료됩니다. 나는 지금 당장 문제가 뭔지 전혀 모른다. 아무도 지금 내 코드의 문제점을 설명 할 수 있습니까? 모든 도움을 주시면 감사하겠습니다.C 프로그램이 예기치 않게 종료됩니다.

+2

체계적으로 코드를 들여 쓰고 적어도 코드에 삽입되어있는 경우에는 들여 쓰기 문자로 탭을 피하십시오. –

답변

0

전에 exit(0);을 호출하기 때문에 사용자가 암호화하거나 암호를 해독하려고했는지 여부에 관계없이 호출해야합니다. 변경 :

else{exit(0);} 

if(result2 == 0) 

사람 :

else if(result2 == 0) 

가도 암호화 나 암호 해독을 선택한 경우에만 exit(0);를 호출 할 수 있습니다.


또한 printf("%d",cipher);은 문자열을 인쇄하지 않습니다. %d 대신 %s 변환 지정자를 사용해야합니다.

+0

당신의 제안에 따라 코드를 변경했는데 이제는 출력이 문자 대신 – user1852728

+0

@ user1852728 인 숫자가되었습니다 :'printf'에서'% d' 변환 지정자를'% s'로 변경해야합니다; 그렇지 않으면's'tring이 아닌'd'ecimal number를 출력하려고합니다. – icktoofay

+0

printf ("% d", cipher)를 변경했습니다. to printf ("% s", cipher); 이제 암호화/암호 해독은 첫 번째 문자에서만 작동합니다. – user1852728

1

scanf의 형식 문자열에있는 %c 변환 지정자는 선행 공백 문자를 삭제하지 않습니다. 이 정의되지 않은 행동 때문에

scanf("%c", &cipher); 

이다 -이 줄 바꿈은 다음 scanf 호출에서 읽을 수 있습니다

scanf("%d", &shift); 

-이 개행 문자 '\n' 다음 scanf 호출 후 버퍼에 남아있을 것을 의미합니다 입력 스트림에서 fflush으로 전화하십시오. 출력 스트림에 대해서만 정의됩니다.

fflush(stdin); 

난 당신이 입력 문자열을 읽고 다음 문자열에서 문자를 추출 fgets를 사용하는 것이 좋습니다 - 이것은 다음과 같은 문장이 잘못된 것을 의미합니다. 또한 화면에 메시지를 즉시 출력하는 개행 문자를 출력하십시오.

+1

C 표준이 그렇지 않더라도 Microsoft는'fflush (stdin);'의 동작을 정의합니다. –

+0

예, 내 시스템의 'fflush'맨 페이지 (Ubuntu 14.04)도 -'입력 스트림의 경우, fflush()는 기본 파일에서 가져 왔지만 응용 프로그램에서 사용하지 않은 버퍼링 된 데이터를 삭제합니다. 스트림의 공개 상태는 영향을받지 않습니다. '하지만 나는 이식성이 없다고 읽었습니다. – ajay

관련 문제