2009-03-09 4 views
1

나는 라이브러리 함수가 사용되는 오래된 프로그램이 있는데 그 라이브러리는 없다.char **를 char * 또는 char로 변환

그래서 저는이 프로그램을 C++ 라이브러리를 사용하여 작성하고 있습니다. 그 오래된 코드에서 이와 같은 함수가 있습니다.

* string = newstrdup ("Some string goes here");

문자열 변수는 char ** string으로 선언됩니다.

그는 "newstrdup"라는 함수에서 무엇을하고 있을까요? 나는 많은 일을 시도했지만 그가 무엇을하는지 몰랐다. 아무도 도울 수있다.

+0

newstrdup() 함수를 붙여 넣을 수 있습니까? –

+0

@ tinkertim : "일부 라이브러리 기능이 사용되는 오래된 프로그램이 있는데 그 라이브러리가 없습니다."... –

+0

newstrdup가 사용되는 이전 코드를 붙여 넣을 수 있습니까? 루프 내부에 배치하는 것이 바람직합니다. .h 파일에서 newstrdup에 대한 선언이 있습니까? – jmucchiello

답변

3

그들이 strdup의 "새로운"버전을 작성한 이유가 있어야합니다. 따라서 다르게 취급하는 구석이 있어야합니다. 아마도 null 문자열처럼 빈 문자열을 반환합니다.

litb의 답변은 strdup의 대체품이지만 그들이 한 일을 한 이유가 있다고 생각합니다.

strdup를 직접 사용하려면 정의를 사용하여 새 코드를 작성하는 대신 이름을 변경하십시오.

+1

"새로운"strdup이라고 불리기 때문에 malloc 대신 strdup 연산자를 new로 사용한다고 생각합니다. 그들은 이식성을 이유로 자체적으로 가지고있을 수도 있습니다. 나도 몰라 :) –

+0

strdup()는 널리 사용 가능하지만 분명히 있기를 원하지만 표준이 아니기 때문에 newstrdup()라고도 부를 수 있습니다. 'strdup-variant-using-new'를 나타내는 'newstrdup()'의 사용도 그럴듯합니다. –

+0

strdup() 함수가 내장되어 있습니다. 하지만 내가 함수를 호출 할 때 * response = newstrdup ("Some String") 세분화 오류가 발생합니다. 그 이유는 무엇이며 어떻게 극복 할 수 있습니까? – Chaithra

0

newstrdup은 아마도 전달 된 문자열의 복제본 인 새로운 문자열을 만들고있다. 문자열에 대한 포인터를 반환합니다 (문자 자체에 pointier 임).

+0

이상한데 왜 문자에 대한 포인터를 반환하지 않습니까? –

+0

@Iraimbilanja :있는 것으로 보입니다. – sfossen

0

그는 기존 포인터를 조작하기 위해 strdup() 함수를 작성한 것처럼 보입니다. 아마도이 포인터를 새로운 크기로 다시 할당 한 다음 해당 내용을 채울 것입니다. 아마도 strdup()에 대한 모든 후속 호출에서 누출을 방지하면서 문자열이 자주 변경되는 루프에서 동일한 포인터를 다시 사용하기 위해이 작업을 수행하고있을 것입니다.

나는 문자열 = redup (& 문자열, "새로운 내용")처럼 구현할 수 있습니다.하지만 그건 저뿐입니다.

편집 : 여기

는 다른 방법으로, 당신이 게시 된 것과 유사한 일을 할 수있는 내 'redup'기능의 싹둑입니다 : 물론

int redup(char **s1, const char *s2) 
{ 
    size_t len, size; 

    if (s2 == NULL) 
     return -1; 

    len = strlen(s2); 
    size = len + 1; 

    *s1 = realloc(*s1, size); 

    if (*s1 == NULL) 
     return -1; 

    memset(*s1, 0, size); 
    memcpy(*s1, s2, len); 

    return len; 
} 

, 내가해야 아마도 * s1의 복사본을 저장하고 realloc()이 실패하면 복원 할 것이지만 그 편집증을 얻을 필요는 없습니다.

4

이 함수는 c- 문자열의 복사본을 만드는 데 사용됩니다. 쓰기가 가능한 버전의 문자열 리터럴을 얻으려면 종종 필요합니다. 그것들 (문자열 리터럴) 자체는 쓰기 가능하지 않기 때문에 할당 된 쓰기 가능한 버퍼에 복사합니다. 그런 다음 주어진 인수를 수정하는 함수에 전달할 수 있습니다 (예 : strtok). 토큰 화해야하는 문자열에 씁니다.

char * newstrdup(char const* str) { 
    char *c = new char[std::strlen(str) + 1]; 
    std::strcpy(c, str); 
    return c; 
} 

당신은 그것을 한 번

delete[] *string; 
를 사용하여 문자열을 사용하여 수행 무료로 가정 할 것이다 : 그것은 새로운 에서는 StrDup라고되어 있기 때문에

나는,이 같은 것을 가지고 올 수 있다고 생각

대체 쓰기 방법은 malloc입니다. 라이브러리가 오래된 경우, 어떤 C++ C로부터 상속 된 것을 사용했을 수 있습니다

char * newstrdup(char const* str) { 
    char *c = (char*) malloc(std::strlen(str) + 1); 
    if(c != NULL) { 
     std::strcpy(c, str); 
    } 
    return c; 
} 

완료되면 지금, 당신은 free를 사용하여 문자열을 무료로되어있다 :

free(*string); 

는 첫 번째 버전을 선호 C++로 쓰고 있다면.그러나 기존 코드가 free을 사용하여 메모리를 다시 할당하는 경우 두 번째 버전을 사용하십시오. 두 번째 버전은 문자열을 삭제할 수있는 메모리가없는 경우 NULL을 반환하지만 첫 번째 예외는이 경우 예외를 throw합니다. 에 NULL 인수를 전달할 때 동작에 대한 또 다른 메모를 가져와야합니다. 라이브러리에 따라 허용되거나 허용되지 않을 수 있습니다. 따라서 필요한 경우 위의 기능에 적절한 검사를 삽입하십시오. POSIX 시스템에서 사용할 수있는 strdup이라는 함수가 있지만 NULL 인수를 허용하지 않으며 메모리를 할당하기 위해 new 연산자 C++도 사용하지 않습니다.

어쨌든, 나는 newstrdup 함수에 대한 Google codesearch를 살펴 보았으며 많은 것을 발견했습니다. 어쩌면 라이브러리 결과 중 하나입니다 :

Google CodeSearch, newstrdup

+0

나는 이런 식으로 프로그램을 시도했다. 이렇게 newstrdup를 호출했습니다. * ersponse = newstrdup (버퍼) 여기서 buffer = "chaithra" 하지만 실행 중에 세그먼트 화 오류가 발생합니다. – Chaithra

+0

Chaithra, 두 버전을 모두 사용해 보셨습니까? –

+0

litb 나는 첫 번째 버전 만 시도했습니다. 지금 나는 다른 것을 시도 할 것이다. – Chaithra

0

내가 동일하게 나타날 것이다 newstrdup() 함수의 프로토 타입과 코드 내에서 "문자열"변수와 무슨 일이 일어나고 있는지 당신이 볼 필요가 있다고 생각 라이브러리 strdup() 버전.

코드에 사용 가능한 (* 문자열) 호출이 있습니까?

내부적으로 중복 된 문자열의 복사본을 보관하고 포인터를 같은 문자열로 다시 반환하지 않는 한 이상하게 보일 수 있습니다.

다시 질문 드리겠습니다.

+0

나중에 똑같은 생각이 들었습니다. 다르게 취급하는 코너 케이스가있을 것입니다. – sfossen

1

라인 *string = newstrdup("Some string goes here");은 (는) newstrdup에 별의 영향을주지 않습니다. string 유형이 char ** 인 경우 newstrdup은 예상대로 char *을 반환합니다. 예상 결과로 string이 이미 결과가 배치 될 char * 유형의 변수를 가리 키도록 설정되었습니다. 그렇지 않으면 코드가 초기화되지 않은 포인터를 통해 쓰고 있습니다.