2012-11-07 3 views
0

검색했지만, 찾을 수있는 것은 문자열을 역순으로 바꾸는 기능입니다. 여기에 지금까지이 작업은 다음과 같습니다 반전이 모두의C에서 문자열을 역전시키는 방법은 무엇입니까?

warning: function returns address of local variable [enabled by default] 
+0

인수로 reversed''포인터를 확인하고이 기능에서 그것을 정의() 나 strlen 사용합니다. – saeedn

+0

@saeedn 다른 방법이 있습니까? 나는 함수 내에서 변수를 생성하고 반환하는 것을 선호한다. 값은 –

+0

이다. 경고 이외에도 코드에 더 많은 문제가있다. 1. 할당 된 버퍼의 크기가 올바르지 않습니다. 'strlen (string) + 1' 바이트를 할당해야합니다. 2. 복사 루프의 배열 색인은 하나씩 꺼져 있으며 NUL 종결자가 역순으로 놓인 문자열에 먼저옵니다. 3. 당신은 반대로 된 문자열의 끝 부분에 널 종결자를 넣지 않습니다. –

답변

2

당신은 동적으로 메모리를 할당 할 수 있습니다 :

char* reverseString(char* string) 
{ 
    int i; 
    int j = strlen(string); 
    char *reversed = malloc(j + 1); 
    ... 

를이 경우, 호출자) (무료로 반환되는 할당 된 버퍼를 기억해야합니다.

아니면 반전 된 문자열을 보관 유지하는데 충분한 크기의 버퍼를 전달하기 위해 호출 할 수 있습니다 : 또한 현재 코드에서

char* reverseString(char* string, char *reversed) 
{ 
    int i, j; 
    j = strlen(string); 

    for (i = strlen(string); i >= 0; i--) 
    { 
... 

참고 : char reversed[sizeof(string)];이 기능 string 내부 그냥 잘못이다 char*이므로 sizeof(string)은이 char *가 가리키는 문자열 길이가 아닌 char* 크기를 제공합니다.

2

먼저 발생에 너무 포인터를 반환, 지역 변수가되는 문제를 명중 그러나

char* reverseString(char* string) 
{ 
    int i, j; 
    char reversed[sizeof(string)]; 
    j = strlen(string); 

    for (i = strlen(string); i >= 0; i--) 
    { 
     reversed[j - i] = string[i]; 
    } 
    return reversed; 
} 

,식이 sizeof(string) 반환 포인터의 크기는 문자열의 길이가 아니라입니다. 그것도 strlen(string)을 사용하십시오. 그리고 ta.speot.is에 명시된 바와 같이, '\0'을 종료 할 때 한 문자를 추가 할 수있을뿐만 아니라 해당 터미네이터를 역순으로 추가해야합니다.

문제의 경우 변수 reversed이 스택에 저장되며이 함수가 메모리 영역을 반환하면 더 이상 사용할 수 없습니다. 힙에 해당 메모리를 할당해야합니다. malloc (나중에 메모리를 free으로 해제) 또는 변수 static을 만들 수 있지만이 경우 다중 스레드 프로그램에서 사용할 수 없습니다.

+2

에서 만들고 싶다면 포인터를 반환하고 1을 더하십시오. –

+0

아하.그렇다면 함수가 반환되면 사라지지 않고 어떻게 메모리를 영구적으로 만들 수 있습니까? –

+0

@ChintanParikh는 힙을 선언하거나 정적 메모리를 사용하거나 포인터를 인수로 전달합니다. – Anon

1

malloc을 사용하여 역순 문자열을위한 공간을 할당하거나 호출자가 새 문자열을위한 공간을 제공 할 수 있습니다. 후자는 일반적으로 메모리 누수를 일으키는 프로그래밍 오류의 위험을 줄입니다.

void reverseString(char *reversed, char *string) 
{ 
    int i, j; 
    j = strlen(string); 

    for (i = strlen(string) - 1; i >= 0; i--) 
    { 
     reversed[i] = string[j-i]; 
    } 
    reversed[j] = 0; /* Don't forget to nul-terminate the reversed string */ 
} 
0

함수에 할당하고 싶지 않은 경우 대상 버퍼를 제공하십시오. 책임은 발신자가 반전 된 것이 소스에 맞게 충분히 큰지 여부입니다.

char* reverseString(char* source, char* reversed) {...} 

및 예를 sizeof 문자열의 크기를 확인하는 올바른 방법이 아니다는

관련 문제