2017-01-03 16 views
0

내가 *는 char * wchar_t에 변환하기 위해 노력하고있어 wchar_t를의 * 중 * 숯불을 구성하는 데 필요한 내 메모리 낭비 솔루션은 문자는 단일 바이트 또는 다중 수 있습니다크기 C

char *wstrtostr(const wchar_t *text) { 
    size_t size = wcslen(text)*sizeof(wchar_t)+1; 
    char *sa = malloc(size); 
    wcstombs(sa,text,size); 
    return sa; 
} 

했다 -byte 및 wcslen은 문자와 동등한 크기에 상관없이 이들을 계산합니다.

문제는 우리가 우리의 문자 포인터를 구축하는 데 필요한 크기를 결정 결과적으로 이러한 특정 문제에 대한 wcslen 및 대안을 구축 할 수 있도록 우리가 WCHAR의 해당 문자의 크기를 결정하는 방법이다?

+4

왜 'wcstombs' 매뉴얼을 읽지 않으십니까? –

+1

[* Kerrek SB *의 주석]까지 추가 (http://stackoverflow.com/questions/41441050/size-needed-to-construct-a-char-out-of-wchar-t-in-c# comment70088254_41441050) : http://man7.org/linux/man-pages/man3/wcstombs.3.html – alk

답변

2

질문에 답하려면 bytes으로 저장된 wcstombs을 반복적으로 호출하여 저장할 수 있습니다. 그러나 그것이 당신이하고 싶어하는 것처럼 보이는 것이 얼마나 효율적인 지 확신하지 못합니다.

일부 메모리를 할당 : 어쩌면 당신은 다른 방법을 원하는 것입니다. wcsrtombs으로 전화하십시오. src가 NULL이되지 않으면 메모리가 부족하여 realloc을 호출하고 마지막으로 중단 한 부분부터 wcsrtombs으로 다시 호출하십시오.

는 데이터에 따라 그렇게 reallocing이 드문 처음에 할당하는 메모리 양을위한 휴리스틱 스를 구축 할 수 있습니다.

업데이트 : 그것은 당신이 리눅스에서 실행하고 휴대 성 또는 C99 준수를 요구하지 않는 경우, 다른 방법이 존재하는 것으로 나타났다. 대상으로 NULL을 사용하여 wcstombs을 호출하면 필요한 바이트 수를 반환합니다. 그런 다음이 바이트 수를 할당하고 wcstombs을 다시 호출 할 수 있습니다. 어떤 접근 방식이 더 좋을지는 상황에 따라 다르며, 특히 문자열의 길이와 올바른 길이를 먼저 추측하는 데있어 경험적 방법이 얼마나 좋은지 상상해보십시오. 또한 간단히 말하자면 코드가 이식성이 필요하면 비표준 API입니다. 포인터에 대한 멜 포메 네 덕분입니다.

두 번째 업데이트 : wcsrtombs 지원, C99에 따르면, 자사의 최종 도착 포인터 세트를 갖는 출력 버퍼에 필요한 길이를 얻기 위해 NULL로 않습니다. Story Teller 덕분입니다. 따라서 NULL로 한 번 호출 한 다음 적절한 크기의 버퍼로 두 번째로 호출 할 수 있습니다.

+1

나는 그 DST로 NULL 사용에 대한 리눅스의 확장에 대한 비밀 참조 인 경우 확실하지 않다? 만일 아마 리눅스 (그리고 아마도 다른 플랫폼)만을 타겟으로하고 이식성을 필요로하지 않는다면 Linux man 페이지에 문서화 된 또 다른 방법이 있다고 말하는 것이 더 도움이 될 것이다. c99 스펙이나 다른 시스템의 매뉴얼 페이지에는 문서화되어 있지 않습니다. OP는 리눅스를 사용하고 있다고 말한 적이 없다. – user133831

+0

당신이 옳습니다; 사과드립니다. 그 것을 답에 메모로 추가 할 수 있습니까? 나는 리눅스와 관련이 있는지 몰랐다. 내 의견을 삭제하겠습니다. – melpomene

+1

''wcsrtombs' (http://en.cppreference.com/w/c/string/multibyte/wcsrtombs) *는'dest'가'NULL' 인 경우 크기를 반환하도록 표준화되었습니다. 따라서 반복 할 필요가 없습니다. 먼저 크기를 계산하는 데 사용할 수 있습니다. 전환하기 전에 정확한 금액을 할당하십시오. – StoryTeller