2014-12-09 6 views
-2

문자열을 스캔하고 ASCII 코드가 5 (+5) 증가하는 매우 단순한 암호화를 만들려고합니다. 글자가 알파벳 끝에 다다르면 시작 부분으로 돌아갑니다 (숫자와 동일). 구두점 및 기타 기호는 암호화되지 않습니다. 암호화 기능이 작동하고있는 것 같지만 문자열을 주 기능으로 다시 전달하는 데 문제가 있습니다. 무엇이 잘못 되었습니까?간단한 문자열 암호화

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

/*function definitions */ 
char encrypt(char input_string[]); 

int main(void) 
{ 
    char input_string[25]; 
    char new_string[25]; 
    char encrypted_string[25]; 
    int i = 0; 

    // scan word 
    printf("Enter word: "); 
    scanf(" %[^\n]", input_string); 
    fflush(stdin); 

    //check input 
    printf("%s\n", input_string); 

    // call encrypt function 
    encrypted_string[25] = encrypt(input_string); 

    // print encrypted version 
    printf("encrypted: %s\n\n", encrypted_string); 

    return 0; 

} 

char encrypt(char input_string[]) 
{ 
    char new_string; 
    static char str[25]; 
    int i; 

    for(i = 0; i < 25; i++) 
    { 
     if (input_string[i] > 96 && input_string[i] < 118) // for a - u 
      { 
       new_string = (input_string[i] + 5); 
      } 
     else if (input_string[i] > 117 && input_string[i] < 123) // for v - z 
      { 
       new_string = (input_string[i] - 21);  
      } 
     else if (input_string[i] > 64 && input_string[i] < 86) // for A - U 
      { 
       new_string = (input_string[i] + 5);  
      } 
     else if (input_string[i] > 85 && input_string[i] < 91) // for V - Z 
      { 
       new_string = (input_string[i] - 21);  
      } 
     else if (input_string[i] > 47 && input_string[i] < 53) // for 0 - 4 
      { 
       new_string = (input_string[i] + 5);  
      } 
     else if (input_string[i] > 52 && input_string[i] < 58) // for 5 - 9 
      { 
       new_string = (input_string[i] - 5);  
      } 
     else 
      { 
       new_string = input_string[i]; 
      } 

     str[i] = new_string; 

    } 

    printf("\n\n"); 

    i=0; 

    //check asccii codes 
    while(str[i]) 
    { 
     printf("%d ", str[i++]); 
    } 

    //print string 
    printf("\n\n%s\n\n", str); 

    //return string to main 
    return(str[25]); 
} 
+0

암호화 (또는 일반적으로 암호화)를 시작하기 전에 몇 가지 C 자습서와 연습이 더 필요합니다. 암호화 문제는 잘못된 오류가 발생하는 경우가 거의 없으며 부적절하게 사용하는 경우 무작위 데이터 만 가져 오는 것입니다. –

+0

C의 함수에서 실제로 "문자열을 반환"할 수는 없습니다. C는 매개 변수를 값으로 전달하고 값을 반환하며, C에는 문자열 값 형식이 없습니다. 함수가 문자열을 만들 필요가 있다면, (1) 호출자가 그것을 위해 공간을 할당하게하고, 그 주소와 길이를 함수 (snprintf() 참조)에서 (2) 함수에 동적으로 할당하고 필요할 때 호출자가이를 해제하도록 트러스트합니다. –

답변

3

return(str[25]); 당신이 26 요소의 을 반환하려는 의미 [아웃 오브 바운드 액세스이며, 문자열의 주소가 아니라 : 여기

내 코드입니다 .

encrypted_string[25] = encrypt(input_string); 아니요, 그렇게 문자열 반환을 지정할 수 없습니다. 여러면에서 잘못입니다.

수정하려면 다음 단계를 따르십시오.

  1. 변화 char encrypt(char input_string[]) 사용 return(str); 대신 대신 char encrypted_string[25];
  2. return(str[25]);
  3. char* encrypt(char input_string[])에, 쓰기 char * encrypted_string;

참고 : 일을 할 것입니다 static 배열을 사용

하지만, IMO, 더 나은 방법은 배열을 동적으로 할당하는 것입니다. d encrypt() 함수에서 채우면 포인터를 반환합니다. 나중에 free()main()의 포인터를 사용할 수 있습니다.

0

함수 :

char encrypt(char input_string[]) 

은 문자 그대로 입력으로 긴 문자열을 받아들이고, 출력으로 단지 하나의 문자를 반환 말한다.
매우 의심스러운 것 같습니다.

하나의 문자가 아니라 문자열을 출력으로 반환하지 않겠습니까?