2012-05-03 3 views
1

나는 C로 간단한 암호화 프로그램을 만들려고합니다. 제 목표는 으로 abc (모든 단어가 될 수 있음)을 번역하는 것입니다. 그런 다음 2을 곱하고 246을 얻은 다음 다시 텍스트로 변환 한 다음 bdf 화면에 씁니다. 여기 올바르게 작동하지 않는 알고리즘이 있습니다. 나는 abc을 입력했고 나는 cbc을 얻었다. 나 좀 도와 줄 수있어?C - 암호화 알고리즘

int main() 
{ 
    int z,o,c,l,i,j,k,*D; 
    char word[10]; 
char alfabe[24]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z','\0'}; 

    printf("enter word"); 
    scanf("%s",word); 

    c=strlen(word); 
    printf("has %d letters ", c); 
    D = (int *) malloc(sizeof(int)*c); 
    for(i=0;i<c;i++) { 
     for(j=0;j<26;j++) { 
      if(word[i]==alfabe[j]) { 
       D[i]=2*(j+1); 
       break; 
      } 
     } 
    } 
    printf("\nlast form before translation "); 
    for(l=0;l<c;l++) { 
     printf("%d",D[l]); /*it s just for control */ 

    } 

    for(z=0;z<c;z++){ 
printf("%c",alfabe[o]); 
         o=D[z]; 
         word[z]=alfabe[o] ; break; } 




    printf("\nnew form of word: "); 
    for(k=0;k<c;k++) { 
     printf("%c",word[k]); 

    } 
scanf("%d"); 


} 
+4

영어로 26 개의 알파벳과 ''\ 0 ''이 있는데, 왜 24의 문자 배열입니까? – vidit

+0

'o'가 초기화되기 전에'alfeabe [o]'를 출력하고'D [z]'를 2로 나누고 어딘가를 빼서 "암호화"를 뒤집어 놓아야합니다. – mgiuffrida

+2

당신은'q'-ist와'w'-ist입니다. 어떻게 감히 그렇게 무례합니까? 그리고'x'에 대해 저를 시작시키지 마십시오 .... –

답변

1

확인, inputed 문자열의 끝을 표시,이 특정 문자를 encrypth 할 필요가 없습니다, 나의 제안은 그래서 당신은 얻을 것 먼저 alfabet에 배치하는 것입니다

alfabet[24] = {'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','y','z'}; 

이 당신에게 1 substracting의 문제를 저장합니다, 그래서 당신은해야합니다 :

for (i = 0; i < c; i++) 
{ 
    for (j = 0; j < 24; j++) 
    { 
     if (word[i] == alfabet[j]) 
     { 
      D[i] = 2 * j; 
     } 
    } 
} 

당신이 입력을 인코딩 부분에서. 그리고 당신은 출력 단어를 생성 할 때 :

for (z = 0; z < c; z++) 
{ 
    printf("%c", alfabet[D[z]]); 
    word[z] = alfabet[D[z]]; 
} 

o 루프에서 특히 더 break;에 대한 필요가 없습니다. - 그 지금 25 개 요소가 이유이다 나는 alfabet'x'을 추가 한

char* getEncryptedWord(char* word) 
{ 
    char alfabet[25]={'\0', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v', 'x', 'y','z'}; 

    int i, j; 
    int size = strlen(word); 

    char* encryptedWord = (char*) malloc(size + 1); 

    for (i = 0; i < size; i++) 
    { 
      for (j = 0; j <= 25; j++) 
      { 
        if (word[i] == alfabet[j]) 
        { 
          if (2 * j > 25) 
            encryptedWord[i] = alfabet[2 * j % 25]; 
          else 
            encryptedWord[i] = alfabet[2 * j]; 

          break; 
        } 
      } 
    } 

    encryptedWord[size] = '\0'; 

    return encryptedWord; 
} 

:

더 효율적인 방법은 문자열의 암호화 통과 처리하는 함수를 작성하는 것입니다. 나는 영어 알파벳의 한 문자가 빠져 있다고 확신하지만, 여기에 오전 3 시이고 영어는 제 1 차 언어가 아닙니다. 또한이 솔루션은 제공 한 alfabet이 입력 및 출력에 존재해야하는 유일한 문자라고 가정합니다.

+0

입력'abc', 출력'ace' .. 그리고 받아 들여지세요 !! – vidit

+0

대답 해 주셔서 감사합니다. 더 많은 것을 알고 싶습니다. 나는 단어를 정의했습니다. [10]하지만, 좋은 해결책이 아닌 것 같아요. 어떻게 malloc을 문자열로 사용할 수 있습니까? 저는 c = strlen (단어); 그래서 그렇게 작성해야합니까 char * word char = (char *) malloc (sizeof (char) * c); – allstar

+0

내가 줬던 첫 번째 대답을 잘못 입증 해 주신 것에 감사드립니다 ... 나는 방금 맹목적으로 코드를 작성 했으므로 테스트하지 않았습니다 ... – George

2

문제는 다음과 같은 루프에 있습니다.

for(z=0;z<c;z++){ 
    printf("%c",alfabe[o]); 
    o=D[z]; 
    word[z]=alfabe[o] ; 
    break; 
} 

왜 휴식을 했습니까? 그것은 단지 첫 번째 문자를 번역합니다. 둘째, 알파벳 배열의 올바른 색인을 얻기 위해 1을 빼야합니다 (추가 한 내용을 다시 실행하기 위해).

word[z]=alfabe[o-1]; 

셋째, 초기화하기 전에 o을 사용하고 있습니까? 컴파일러가이를 경고해야합니다. 넷째, 27 문자를 크기 24의 문자 배열에 저장하는 이유는 무엇입니까?

char alfabe[24]={'a','b',...........,'\0'} 

그리고 마지막으로 중요한 것은 당신은 사용자가 xyz 같은 것을 입력하면 모듈러 산술,이 실 거예요 작업을 사용해야합니다. 모든 '\0'의 첫

+0

대답 해 주셔서 감사합니다. 더 많은 것을 알고 싶습니다. 나는 단어를 정의했습니다. [10]하지만, 좋은 해결책이 아닌 것 같아요. 어떻게 문자열로 malloc을 사용할 수 있습니까? 저는 c = strlen (단어); 그래서 그렇게 작성해야합니까 char * word char = (char *) malloc (sizeof (char) * c); – allstar

0

(팁 : 문자 AZ 만 사용하려는 경우 해당 숫자를 찾으려면 배열을 반복 할 필요가 없습니다. 단순히 'a'의 숫자 값을 빼고 숫자를 1, 문자 'a'가 1로 매핑되기를 원한다면)

모듈로 산술이 언급되었지만 1 : 1 매핑이 느슨해 지므로 문제가 발생합니다. 즉, 두 글자가 같은 숫자.