2016-05-31 5 views
2

매개 변수에 주어진 문자열 (문자 배열)을 역으로 변환하는 기능을 수행했지만 작동하지 않습니다. 그 이유는 무엇입니까? 이 같은inverse string in c

내가 갖는 것을 : æIGt (Kt를 $ @ 0

덕분에 당신에게

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

char * 
inverse(char *s) 
{ 
    int i, taille = strlen(s); 
    char r[taille]; 
    for (i = 0 ; i < taille ; i++) 
    { 
     r[i] = s[taille - i - 1]; 
    } 
    r[i] = '\0';  
    return r; 
} 

int 
main() 
{  
    char s[] = "kira"; 
    char *r = inverse(s); 

    printf("%s",r); 

    return 1; 
} 
+0

작동하지 않는 기능에 대해 좀 더 구체적으로 설명하십시오. 그것은 segfaulting인가? 컴파일에 실패 했습니까? 잘못된 결과를 주는가? – merlin2011

+0

그리고 일관된 스타일을 가지고 있으며 읽을 수있는 코드를 작성하십시오. 또한'main()'의 성공 값은 '0'입니다. 아니면 정확하게 'EXIT_SUCCESS'. 마지막으로, 문자열을 뒤집 으면 생각해야합니다! 얼마나 많은 문자를 교환해야합니까? 그러면 왜 작동하지 않는지 알게 될 것입니다. –

+2

로컬 배열의 주소를 반환하지만 배열에 스택이 할당되고 함수가 반환 될 때 더 이상 사용할 수 없습니다. (1)'malloc'을 호출하여 힙에 배열을'inverse' 할당합니다. (2) 호출자가 원하는 결과 배열을 가리키는 포인터를 전달하도록합니다. 또는 (3)'inverse '인수 문자열을 그 자리에서 역순으로. –

답변

7

로컬 변수에 대한 포인터를 반환하고 있습니다. 이 변수는 함수 역이 반환 될 때 파괴되므로 함수가 종료 된 후 포인터에 액세스하면 잘못된 데이터가 반환됩니다.

+0

어떻게 해결할 수 있습니까? –

+3

@AmarBessalah,'''char * r = malloc (taille + 1)'''에 의해 힙에 메모리를 할당하거나'''r'''을 출력 변수로 만들거나 r 내용을''' s''' – kaspersky

+0

@ gg.kaspersky 내가 할당하지 않을 때 왜 작동하지 않는지 설명해 주시겠습니까? 감사합니다 –

4

당신은 어떤 출력을 제공하지 않았기 때문에 그것은, 당신이 질문에서 말하기 약간 단단하지만 내를 가장 좋은 추측은 스택에있는 항목에 대한 포인터를 반환하기 때문에 다음 호출에서 덮어 쓸 것입니다 (printf) inverse 자리에 응답을 입력해야합니다. 대신 다음을 시도하십시오.

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

void inverse(char *s, char *r) 
{ 
    int i,taille=strlen(s); 


    for(i=0;i<taille;i++) 
    { 
     r[i]=s[taille-i-1]; 
    } 
    r[i]='\0'; 
} 



int main() 
{ 

char s[] = "kira"; 
char r[sizeof(s)]; 

inverse(s, r);  

printf("%s",r); 

return 1; 
} 
1

문자열을 뒤집는 또 다른 표준 접근법은 각 반복마다 두 문자를 교체하는 문자열의 시작과 끝 모두에서 작동하는 포인터를 사용합니다. 그것은 당신이 말할 수있는 여러 가지 방법이 있습니다 자리에 원래 문자열 (원본을 보존, 또는 두 번째 문자열을 전달하고 거기에 반전 된 문자열을 배치해야하는 경우 사본을)

/** strrevstr - reverse string, swaps 2 chars per-iteration. 
* Takes valid string and reverses, original is not preserved. 
* If 's' is valid and non-empty, returns pointer to 's', 
* returns NULL otherwise. 
*/ 
char *strrevstr (char *s) 
{ 
    if (!s || !*s) {  /* validate string is not NULL and non-empty */ 
     printf ("strrevstr() error: invalid string\n"); 
     return NULL; 
    } 

    char *begin = s; /* pointers to beginning and end, and tmp char */ 
    char *end = begin + strlen (s) - 1; 
    char tmp; 

    while (end > begin) /* swap both beginning and end each iteration */ 
    { 
     tmp = *end; 
     *end-- = *begin; 
     *begin++ = tmp; 
    } 

    return s; 
} 

을 바꿉니다 이 문제와 다른 답변을 제공함으로써 문제에 접근하기 위해서는 요구 사항을 충족시키는 솔루션을 맞춤식으로 조정할 수 있어야합니다.

모든 접근 방식에는 장단점이 있습니다. 역순으로 된 문자열을 저장하기 위해 새로운 메모리 블록을 동적으로 할당하는 것은 아무런 문제가 없습니다. (1) 새로운 블록의 시작 주소에 대한 포인터를 유지하므로 (2) 더 이상 사용하지 않을 때 해제 될 수 있습니다 필요합니다. 원래 문자열을 보존해야하는 경우, 역순으로 처리 된 문자열을 보유하기에 충분한 크기의 문자 배열에 포인터를 전달하면 다른 옵션으로 원본을 보존 할 수 있습니다.

질문이 있으면 모든 대답을 살펴보고 알려주세요.