2014-06-20 1 views
1

함수 내에서 문자열을 수정하고 싶습니다. 내 코드는 매우 쉽습니다.C 참조 문자열 전달

#include <stdio.h> 


void doSomething (char **string) 
{ 
    sprintf(string,"some string"); 
} 

int main (void) 
{ 
    char *origString = NULL; 

    doSomething (&origString); 
    printf ("%s\n", origString); 

    return 0; 
} 

하지만이 코드는 작동하지 않습니다. 솔루션 이상의 설명에 정말 감사하겠습니다.하지만 솔루션도 환영합니다.

% sp와 함께 다른 문자열을 추가하기 때문에 실제로 sprintf 함수를 사용해야합니다.

감사합니다.

해결!

#include <stdio.h> 


void doSomething (char **string) 
{ 
    *string = malloc(strlen("some string") + 1); 
    sprintf(*string,"some string"); 
} 

int main (void) 
{ 
    char *origString = NULL; 

    doSomething (&origString); 
    printf ("%s\n", origString); 
    free(origString); // Previously malloced in doSomething 
    return 0; 
} 
+2

경고 플래그 – Alexis

+0

으로 컴파일해야합니다. sprintf가 문자열에 메모리를 할당하지 않습니다. 'main()'에 문자 배열을 선언하거나'asprintf'를 사용해야합니다. –

답변

1

이 문자열 (200 자 배열)의 첫 번째 문자에 대한 포인터에

#include <stdio.h> 


void doSomething (char *string) 
{ 
    sprintf(string,"some string"); 
} 

int main (void) 
{ 
    char origString[200]; 

    doSomething (origString); 
    printf ("%s\n", origString); 

    return 0; 
} 

이 통과를 작동합니다. 그런 다음이 배열의 내용을 수정할 수 있습니다. malloc에 ​​

#include <stdio.h> 


void doSomething (char **string) 
{ 
     const char * const x = "Some string ksdskjkj"; 
    *string = malloc(strlen(x) + 1 /* For the null characcter */); // Now origString will also point to this dynamic memory 
    sprintf(*string,"some string"); 
} 

int main (void) 
{ 
    char *origString = NULL; 

    doSomething (&origString); 
    printf ("%s\n", origString); 
    free(origString); // Previously malloced in doSomething 
    return 0; 
} 
+0

@ user1042850 - 위 내용을 참조하십시오 - 감사합니다. –

+0

ok! 완전한! 그게 내가 찾고 있던거야! 감사. – user1042850

+0

@ user1042850 - 들여 쓰기를 정리하십시오. –

2

sprintf 함께

EDIT

는 첫 번째 인자는 아니고 char** 같은 char* 소요 그래서 sprintf(*string,"some string");이어야한다. 그러나 *string은 그 시점에서 NULL이되므로 여전히 작동하지 않습니다.

문자열의 메모리를 doSomething 함수로 할당하려면 해당 함수에 메모리를 할당해야합니다. sprintf은 메모리를 할당하지 않습니다. 따라서 sprintf으로 전화하기 전에 malloc을 사용하여 메모리를 할당하고 *string이 해당 메모리를 가리 키도록해야합니다. 또한 기능을 사용하는 사용자는 일단 작업이 끝나면 메모리를 비워야 함을 알고 있어야합니다.

0

에드 치유의 솔루션은하지만 어떻게 원래 (컴파일러 설정에 따라 경고의 몇이기는하지만)이와 같은 결과를 얻을 수 있었을 거라고 인라인을 유지하는 올바른 :

#include <stdio.h> 


void doSomething (char **string) 
{ 
    sprintf(string,"some string"); 
} 

int main (void) 
{ 
    char * origString[200]; 

    doSomething (origString); 
    printf ("%s\n", origString); 

    return 0; 
} 

C 문자열은 말 그대로 문자 배열입니다. doSomething()에 널 포인터를 전달하려고했습니다. doSomething (char ** string)은 char 포인터에 주소를 사용하므로 origString 주소 (즉, & origString)를 전달할 필요가 없습니다. doSomething (origString)을 통해 참조 해제 된 포인터를 전달하면됩니다.

+0

내 대답을 downvote하려고한다면 적어도 코드가 작동하지 않는다 (작동하지 않는다)거나 내 설명이 잘못되었다는 것을 언급해야한다. – nocdib