2014-11-07 2 views
-1

제 문제는 Eclipse가 제 코드에 어떤 오류가 있는지 보여주지 않고 어쨌든 컴파일하는 것입니다. 그러나 프로그램을 실행할 때 아무 일도 일어나지 않습니다. 나는 심지어 첫 번째 printf 줄을 보지 못했다.Eclipse에서 컴파일 할 때 C의 Cesar Cipher와 관련한 어려움

당신은 카이사르 암호를 사용하여 메시지를 암호화하는 프로그램을 작성하다 : 여기에 좋아

프롬프트입니다. 사용자는 키 값과 암호화 할 메시지의 값 을 입력합니다. 아래의 예제 실행과 프로그램 출력은이 형식을 정확하게 따라야합니다. 사용자 입력은 밑줄이 그어져 있습니다.

3

는 메시지를 암호화 할 입력 :

는 시프트 양 (1-25)를 입력

가, 어서 내 일을합니다.

암호화 된 메시지 : Jr dkhdg, pdnh pb gdb.

내 코드하십시오 char 오버 플로우 수 소문자 ch = ch + k;

#include <stdio.h> 
#include <ctype.h> 

char encrypt(char ch, int k){ 

    if (isalpha(ch)){ 

     if (isupper(ch)) { 
      ch = ch + k; 
      if (ch > 'Z') { 
       ch = ch - k; 
       ch = ((ch - 65) + k) % 26 + 65; 
      } 
     } 
     else { 
      ch = ch + k; 
      if (ch > 'z'){ 
       ch = ch - k; 
       ch = ((ch - 97) + k) % 26 + 97; 
      } 
     } 
    } 



    return ch; 
} 

void main(){ 
    int k = 0; 
    char ch = 'a'; 
    printf("Enter shift amount (1-25):\n"); 
    scanf("%d ", &k); 
    printf("Enter message to be encrypted:\n"); 
    ch = getchar(); 

    while(ch != '\n'){ 
     encrypt(&ch, k); 
    } 

    printf("\n"); 
    printf("Encrypted message: "); 
    while(ch != EOF){ 
      putchar(ch); 

     } 
    return 0; 
} 
+1

오늘은 공식적인 카이사르 암호의 날입니까? 이것은 제가 오늘 본 네 번째 또는 다섯 번째 질문입니다! 어쨌든, 디버깅을 배우는 것은 컴퓨터 프로그래밍 행운의 중요한 부분입니다. –

+0

알다시피, 당신은 오직 하나의'char'을 요구합니다. 암호화가 정확하다면 카이사르 - 카이 프르 (chiphre)를 얼마나 자주 사용하든 관계없이 편지가 개행 문자가되지는 않습니다. – Deduplicator

답변

0

.

%26int 수학으로 수행하십시오.

if (isupper(ch)) { 
     ch = (ch - 'A' + k)%26 + 'A'; 
    } 
    else if (isupper(ch)) { 
     ch = (ch - 'a' + k)%26 + 'a'; 
    else { 
     Report_BadInput(); 
    } 

입력

printf("Enter shift amount (1-25):\n"); 
// scanf("%d ", &k); The space really messes things up. 
// The space tells `scanf()` to keep on scanning until non-white-space is found. 
scanf("%d", &k); 

읽기 및 인쇄 루프가 엉망이되어

을 엉망.

printf("Enter message to be encrypted:\n"); 
int ch; // Use int here 
while ((ch = getchar()) != '\n') && (ch != EOF) { 
    if (isalpha(ch) { 
    ch = encrypt(ch, k); 
    } 
    putchar(ch); 
} 
putchar('\n'); 
0

암호화 기능이 잘못되었습니다. &ch을 사용하면 캐스팅하지 않고 포인터에서 정수를 만들고 있으므로 입력을 저장하기 위해 캐스팅하거나 배열을 만들어야합니다. 이 경우 void 타입과 프로그램 끝점이므로 반환 값을 main()에 추가 할 필요가 없습니다.

#include <stdio.h> 
#include <ctype.h> 

void main(){ 
    static int x = 0; 
    int k; 
    char c; 
    char cipher[ARRAYMAX] = {0}; 
    printf("Enter shift amount (1-25):\n"); 
    scanf("%d", &k); 
    printf("Enter message to be encrypted:\n"); 
    scanf("%c", &c); 
    while((c=getchar()) != '\n') { 
     cipher[x++]=(char)(c+k); 
    } 
    printf("%s", cipher); 
} 

당신은 다른 함수에서 암호화 코드를 wirte하고 크기 (ARRAYMAX)의 지정하지 않고 배열을 만들 수 malloc를 사용할 수 있습니다.

+0

이렇게하면 [Caesar Cipher] (http://en.wikipedia.org/wiki/Caesar_cipher)에 따라 'A에서 Z로'를 'A에서 Z'로 매핑하지 않습니다. – chux

관련 문제