2011-11-15 4 views
1

기본적으로 단순한 시저 키퍼 프로그램 (간단하게 하드 코드 된 키 12로 ASCII 문자를 이동)을 작성했지만 C에 익숙하지 않아 포인터에 문제가있어서 입력으로 char 배열을 수락하고 그것들을 출력으로 돌려 보냅니다.C에서 포인터를 사용하는 데 문제가 있고 함수에서 사용하는 경우

여기까지 내가 지금까지 얻은 바가 있습니다. 무엇이 잘못되었는지 알아 내도록 도와 줄 수 있습니까?

미리 감사드립니다.

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

int main() { 

    char hello[50][50] = {{'h','e','l','l','o'}, {'h','r','u','\0'}}; 
    hello = encrypt(hello); 

    printf("%s", hello[50][50]); 

} 

char** encrypt(char text[50][50]) { 
    int i,j; 
    for(i=0; i<50; i++) { 
     for(j=0; j<50; j++) { 
      if (text[i][j]!='\0') { 
       text[i][j] = (char)((int)text[i][j]+12)%256; 
      } else { 
       break; 
      } 
     } 
    } 
    return text[50][50]; 

} 

char** decrypt(char text[50][50]) { 
    int i,j; 
    for(i=0; i<50; i++) { 
     for(j=0; j<50; j++) { 
      if (text[i]!='\0') { 
       text[i][j] = (char)((int)text[i][j]-12)%256; 
      } else { 
       break; 
      } 
     } 
    } 
    return text[50][50]; 
} 
+0

어떤 문제가 있습니까? 무슨 일이 생기고 그 대신에 무엇을 기대 했습니까? – sth

+0

포인터가 손실되었습니다. 항상 호환되지 않는 형식 오류가 발생합니다. 그러면이 작은 데모를 어떻게 작동시킬 수 있습니까? – Dave

+0

컴파일러가 어떤 라인을 가지고 있습니까? 오류 메시지를 통해 오류의 원인을 알 수 있습니다. –

답변

1

귀하의 주요 문제는 50 개 문자 블록의 50 개 세트를 할당

char hello[50][50]에서 hello[50][50]이 무엇을 의미하는지 이해하는 것 같다. 그러나 그 자체에 hello[50][50]은 51st b 잠금의 51 번째 위치를 가리키는 단일 문자를 나타냅니다. C는 0을 차지하므로 블록은 [0]에서 [49]까지이므로 [50]은 유효하지 않습니다.

2 차원 배열을 C에 전달하는 것은 생각대로 수행되지 않습니다.

단어가 공백으로 단절된 긴 문자열로 1 차원 배열을 사용하는 것이 좋습니다. 훨씬 명확하고 이해하기 쉬울 것입니다. 당신이 char hello[50]; 등의 1 차원 배열을 할당하는 경우

당신은 함수 내에서 [I] 표기법을 안녕하세요을 사용하여 여전히 func(char hello[]) 또는 func(char *hello)로 함수에 전달할 수

암호화를 수행하는
0

코드는 조금있다 경우에 따라 문제의 캐릭터의 값에 12를 더한 다음, mod 256을 수행합니다. 높은 값의 글자를 전달했다면, 그것은 당신이 원하는 것을하지 않을 것입니다.

예 :

('A'+ 12) % 256 => (65 + 12) = 77 %, 256 => 'M'//이 예상대로 작동

('X'+ 12 ') % 256 => (88 + 12) % 255 = 100'> 'd'// 이것은 'J'였을 것입니다.

해결 방법은 함수를 바꿔 올바르게 감싸는 것입니다. 귀하의 예제는 소문자 만 사용하기 때문에이 경우에만 설명 할 것입니다.

text[i][j] = (((text[i][j] - 'a') + 12) % 26) + 'a'; 
+0

감사하지만 작성한 문자는 알파벳 문자로 암호화되므로 모든 ASCII 문자를 암호화 할 수 있기를 원합니다. 그래서 256 (256 ASCII 문자)을 선택했습니다. – Dave

+0

아시다시피 ASCII는 기술적으로 7 비트 만 사용하므로이 경우 256 대신 128을 사용하는 것이 좋습니다. – shenles

관련 문제