2016-10-17 3 views
0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int count=0; 
int main(){ 
    int n; 
    scanf(" %d",&n); 
    char *s = (char *)malloc(10240 * sizeof(char)); 
    scanf(" %s",s); 
    int length=strlen(s); 
    char array[length+1]; 
    int k; 
    scanf(" %d",&k); 
    while(*s!='\0') 
     { 

     char a= *s + k; 
     if(a>90 && *s<=90) 
      { 
      a=65+(k-1); 
      array[count]=a; 
     } 
     else if(a>122 && *s<=122) 
      { 
      a=97+(k-1); 
      array[count]=a; 
     } 
     else if (a >=0 && a<=64) 
      { 
      array[count]=a; 
     } 
     else if(a>=123 && a<=126) 
      { 
      array[count]=a; 
     } 

     count++; 
     s++; 


    } 
    array[count+1]='\0'; 
    printf("%s",array); 
    return 0; 
} 

아래의 코드에서 암호화되지 않은 각 문자는 알파벳순으로 나열된 후 'k'공백이있는 문자로 바뀝니다. 알파벳은 대소 문자를 구분하고 원형으로 생각하십시오. 'k'가 알파벳 끝을 지나치면 처음으로 되돌아갑니다 (예 : 'z'다음의 문자는 'a', 'Z'다음의 문자는 'A').Caesar Cipher Encryption 알고리즘의 출력으로 가비지 문자를주는 아래의 코드는 무엇입니까?

어디서 잘못 될지 알 수 없으므로 입력 가능한 모든 문자 시퀀스에 대해 null이 인쇄됩니다. 특수 기호는 암호화 된 문자열에서 변경되지 않습니다.

+0

['malloc()'과 가족을 'C'로 반환하지 않는 이유에 대한이 토론을보십시오.] (http://stackoverflow.com/q/) 605845/2173917). –

+0

... 특히' '을 포함하지 않았으므로'malloc'을 올바르게 사용하려면 필수 항목입니다. 그리고 당신의'array []'는 크기가 작다. 터미네이터 공간을 남기지 않습니다. – WhozCraig

+0

포함 시키더라도 원하는대로 작동하지 않으며 출력이 변경되지 않습니다. – stackuser

답변

0
k = 2; //<== random input 
while (*s != '\0') 
{ 
    printf("count %d\n", count); 
    char a = *(s + k); 
    ... 
} 

이 루프는 문자열 s의 끝으로 이동하고, char ak 위치 현재 인덱스 이후의 문자를 추출하려고합니다.

문자열의 끝에있을 때 *(s + k)이 (가) 범위를 벗어납니다.

int i; 
for (i = 0; i < length; i++) 
{ 
    if (i + k == length) break; 
    if (i + k < 0) break; //assuming k can be negative 
    char a = s[i + k]; 
    ... 
} 

이 방법 i+k 항상 0length 사이에 유효한 인덱스를 다음과 같이 내가 코드를 재 작성하는 것이 좋습니다.

또 다른 문제는 여기에 있습니다 :

if (a>90 && *s <= 90) 
{ 
    a = (char)(65 + (k - 1)); 
    array[count] = a; 
} 
else if (a>122 && *s <= 122) 
{ 
    a = (char)(97 + (k - 1)); 
    array[count] = a; 
} 
else if (a >= 0 && a <= 64) 
{ 
    array[count] = a; 
} 
else if (a >= 123 && a <= 126) 
{ 
    array[count] = a; 
} 
count++; 

이러한 조건 중 적어도 충족한다는 보장이 없습니다. 사실 모든 조건이 거짓 일 가능성이 큽니다. 따라서 어떤 일이 발생합니까? array[0]은 초기화되지 않은 상태로 유지되지만 count은 계속 증가하므로 array 끝에는 가비지가 포함됩니다. countarray[count]으로 설정된 경우에만 증가되도록 변경해야합니다.

시저 암호화의 경우 문자를 왼쪽이나 오른쪽으로 이동하려고합니다. % 연산자를 사용하여이 작업을 수행 할 수 있습니다.

strcpy(s, "ABCDEFGZ"); 
int length = strlen(s); 
char *array = malloc(length + 1); 
int shift = 2; 
int i; 
for (i = 0; i < length; i++) 
{ 
    char c = s[i]; 
    if (c >= 'A' && c <= 'Z') 
     c = 'A' + (c - 'A' + shift) % 26; 
    array[i] = c; 
} 
array[i] = 0; 

'Z'를 오른쪽으로 이동 참고 % 운영자는 확인은 위의 기능은, 그것은 낮은 경우에 완료되지 작동하지 않습니다되어 'Z'

'A' 사이의 범위에 다시 얻을 수 있습니다 글자는 숙제를위한 것입니다 ...

관련 문제