2013-11-26 2 views
-1
#include <stdio.h> 

void caesar(char bemenet[], char eredmeny[], int n){ 
int i = 0; 
    for(i = 0; bemenet[i] != '\0'; i++) { 
     if(bemenet[i] == 'z') { 
      eredmeny[i] = 'a'; 
      eredmeny[i] += n-1; 
     } 
     else 
     { 
      eredmeny[i] += n; 
     } 
    } 
    eredmeny[i] = '\0'; 
} 

int main(){ 
char tomb1[]="caesarkodolas"; 
char tomb2[]=""; 

caesar(tomb1,tomb2,1); 

printf("%s \n",tomb2); 

return 0; 
} 

은 "eredmeny"(결과)이에 대한 나의 아웃 : "dbftbslpepmb"하지만 tomb2 =>이 .. OK 아니다 ☺dbftbslpepmb 내가 여분의 문자가 원인 | ☺ | ..시저 코드

+0

출력 배열이 너무 작아서 뻔뻔스럽지 않은 정의되지 않은 동작입니다. –

+0

이 접근법은 깨졌습니다. '1'보다 위의 'n'에 대해서는 작동하지 않습니다. 'caesar (tomb1, tomb2,10);'(일부 가비지 출력을 보려면) (http://ideone.com/cyVmK0)로 수정 된 코드를 시도해보십시오. – dasblinkenlight

답변

0

우선 당신은 결과를 저장할만큼 충분히 큰 tomb2을 가져야합니다. 또한

char tomb2[255] = {0}; 

위에서 언급 한 바와 같이 예를 들어

, 당신은 여기에 오류

당신은 너무

eredmeny[i] += bemenet[i] + n

이 문자열을 변경 eredmeny[i]에 유효한 ASCII 값을 할당해야
else 
{ 
    eredmeny[i] += n; 
} 

평소와 마찬가지로 저의 크기를 넘지 않고 배열에 포인터를 전달하는 것은 나쁜 습관입니다. 버퍼 오버플로를 쉽게 얻을 수 있습니다.

+0

감사합니다. – 18uploadz

+0

이 대답을 수락 했으므로 @dasblinkenlight의 조언을 참조하여 방탄 버전의 알고리즘을 작성하는 방법을 살펴보십시오. – Deck

1

는 두 번째 매개 변수에 대한 충분한 메모리를 할당하고,이 선이에

eredmeny[i] += n; 

변경 :이 것을

eredmeny[i] = bemenet[i] + n; 

참고 하지Caesar cipher의 방탄 구현 : 그것을 위해 일 것 n==1이지만 더 큰 숫자는 n입니다. 오히려 'z'에 대한 테스트 및 'a'로 교체보다, 편지 모듈 (26)의 새로운 위치를 계산 한 다음에 a을 추가합니다 :

당신은을 "주위-포장"구현하는 다른 방법을 생각해야

void caesar(char bemenet[], char eredmeny[], int n){ 
    int i; 
    for(i = 0; bemenet[i] != '\0'; i++) { 
     // Compute the position of the replacement letter 
     int pos = (bemenet[i] - 'a' + n) % 26; 
     // Place the letter into the output. 
     eredmeny[i] = 'a' + pos; 
    } 
    eredmeny[i] = '\0'; 
} 

demo.

0

는 바로 수학을하고 있지 않습니다.

소문자 만 사용하는 경우 n을 추가해야하지만 많은 문자가 "이후"이므로 "a"에서 다시 시작해야합니다.

는이 같은 더 뭔가를 원하는 :

for(i = 0; bemenet[i] != '\0'; i++) { 
    int encrypted = bemenet[i] + n; 
    if (encrypted > 'z') encrypted = encrypted - 'z' + 'a'; 
    eredmeny[i] = (char)encrypted; 
} 

(여기 다른 답변에 설명 된대로 또한 출력 배열의 크기를 고정).