2016-10-31 27 views
1

(말씀으로 문자열 단어를 반전) -strcpy (char *, char a [])가 잘못된 결과를 제공합니다. 내가 달성하기 위해 노력하고있어

입력을 (. 문자열 리터럴은 가정) This is a string

출력 : string a is This

내 순진 솔루션을 :

  1. 복사 t 그는 문자 배열에 문자열 리터럴을 씁니다. [sizeofstring] STR 숯 배열
    현재 내용 : This is a string

  2. 는 단어 배열 워드 리버스 다른 배열에 저장

    .
    char reverse [sizeofstring] : sihT si a gnirts

  3. 마지막 위치에서 0 번째 위치로 역순 배열입니다. char 어레이 솔루션에 보관하십시오.
    char 솔루션 [sizeofstring] : string a is This

  4. strcpy(pointertoachar, solution). - 함수는 char에 대한 포인터를 리턴해야하기 때문에.

코드 :

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

char *reverse(char *input) { 
    int n = strlen(input); 
    char str[n]; 

    char reverse[n]; 
    char solution[n]; 

    char *solutionp = malloc(sizeof(char) * n); 
    strcpy(str, input); 

    int last = 0; 
    int i = 0; 
    int q = 0; 

    while (str[i] != '\0') { 
     if (str[i] == ' ') { 
      printf("i : %d\n", i); 
      printf("LAST:%d\n", last); 
      for (int t = (i - 1); t >= last; t--) { 
       reverse[q] = str[t]; 
       q++; 
      } 
      last = i + 1; 
      reverse[q] = ' '; 
      q++; 
     } 
     i++; 
    } 

    // for the last word. 
    for (int cc = i - 1; cc >= last; cc--) { 
     reverse[q] = str[cc]; 
     q++; 
    } 

    // Traversing from the last index to the first. 
    int ii; 
    int bb = 0; 
    for (ii = n - 1; ii >= 0; ii--) { 
     solution[bb] = reverse[ii]; 
     bb++; 
    } 

    // This prints the right output. 
    // printf("%s\n",solution); 

    // Copying from a char array to pointer pointing to a char array. 
    strcpy(solutionp, solution); 

    return solutionp; 
} 

int main() { 
    char *str = "This is a string"; 
    char *answer; 

    answer = reverse(str); 
    printf("%s\n", answer); 

    printf("\n"); 

    return 0; 
} 

문제 : 의도 한대로

1 단계에서 3 단계로 노력하고 있습니다. 디버깅 목적을 위해 솔루션을 포함하는 배열의 출력을 인쇄 해 보았습니다. 그러나 작동했습니다. 그러나 strcpy을 사용하는 포인터로 가리키는 char 배열에 복사하고 포인터를 반환하면 부분적으로 오른쪽 출력과 함께 가비지 값이 인쇄됩니다.

OUTPUT :
캐릭터 A가이 Z이다 ?? ??

4 단계에서 문제가있는 것 같습니다. 내가 잘못 했나요?

+2

'int n = strlen (입력); char str [n]; [...] strcpy (str, input);'경계를 벗어난 쓰기, 정의되지 않은 동작. – EOF

+3

문자열에는 NUL 종료 문자를위한 공간이 있어야한다는 것을 기억하십시오. str 변수의 길이는 1 바이트입니다. –

+0

@BjornA. 나는 str [n], reverse [n], solution [n]을 [n + 1]로 바꾸려고 시도했다. 여전히 같은 결과를 출력합니다. –

답변

0

코드의 주요 문제는 임시 버퍼를 1 바이트가 너무 짧게 할당하는 것입니다. 문자열의 끝에 '\0' 바이트의 충분한 공간을 만들어야합니다.

당신은 역순으로 블록을 복사 할 보조 기능을 사용하여 코드를 단순화 할 수 있습니다

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

char *reverse_block(char *dest, const char *src, int len) { 
    for (int i = 0; i < len; i++) { 
     dest[i] = src[len - i - 1]; 
    } 
    dest[len] = '\0'; 
    return dest; 
} 

char *reverse_words(const char *string) { 
    int i, last; 
    int len = strlen(string); 
    char temp[len + 1]; 

    for (i = last = 0; i < len; i++) { 
     if (string[i] == ' ') { 
      // copy the word in reverse 
      reverse_block(temp + last, string + last, i - last); 
      temp[i] = ' '; 
      last = i + 1; 
     } 
    } 

    // copy the last word in reverse 
    reverse_block(temp + last, string + last, len - last); 

    // allocate an array, reverse the temp array into it and return it. 
    return reverse_block(malloc(len + 1), temp, len); 
} 

int main(void) { 
    const char *string = "This is a string"; 

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

    char *solution = reverse_words(string); 
    printf("%s\n", solution); 

    free(solution); 

    return 0; 
} 

이제 장소에 블록을 반전 기능을 구현하여 코드를 더욱 향상시킬 수 있습니다. 이렇게하면 더 이상 임시 버퍼가 필요하지 않으며 문자열 복사를 직접 수행하면 코드가 단순 해집니다.