2013-01-05 2 views
4

int을 매개 변수로 사용하여 wchar_t* 형식을 얻으려고합니다. 나는 많이 봤지만 더 혼란스러워졌다. 나는 [5]를 인쇄하려면 위의 예상wsprintf를 사용하여 int를 wchar_t로 변환 *

int main(int argc, char** argv) { 

    wchar_t buf[16]; 
    wsprintf(buf, L"%d", 5); 
    wprintf(L"[%ls]\n", buf); 

    system("pause"); 
    return 0; 

}; 

wchar_t, wsprintfwprintf 각각 char, sprintfprintf의 넓은 문자 동등하다고 가정하는 데,하지만 [] 사이에 쓰레기를 인쇄 : 그래서,이 코드를 고려 . 원하는 결과를 얻기위한 올바른 방법은 무엇입니까? 그리고 내가 여기서 오해 한 것은 무엇입니까?

(I는 휴대 여기에 보안보다 더 중요하다 명확히해야한다, 그래서 내가 대신 안전 벤더 고유의 확장 기능이 제품군을 사용하는 솔루션을 알고 싶습니다.)

+0

인쇄 쓰레기는 어떻게 압니까? 출력을 파일로 파이프하여 16 진수 편집기에서 살펴 보았습니까? –

+0

아니요.'wprintf'가 콘솔에 예상대로 인쇄 할 것이라고 가정했습니다. 어떻게 든 잘못 되었나요? –

+1

나를 위해 (맥 OS X 10.7.5),'swprintf()'는'[5]'를 예상대로 출력하지만'wsprintf()'는 사용할 수 없다. –

답변

5

wsprintf()은 Windows 관련 기능으로 Unix에서는 사용할 수 없습니다. (구현에 버그가 있다면 놀라지 않을 것입니다.) 달성하고자하는 것은 더 이식성있는 방식으로 수행 할 수 있습니다 (이 약간 수정 된 코드 스 니펫을 시도했으며 예상대로 작동했습니다).

#include <wchar.h> 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    wchar_t buf[16]; 
    swprintf(buf, sizeof(buf)/sizeof(*buf), L"%d", 5); 
    wprintf(L"[%ls]\n", buf); 

    return 0; 
} 

출력 :

[5] 
1

그것은 나에게 나타납니다 출력에 잘못된 형식 지정자를 사용하고 있습니다. L은 S "문자열"형식 지정자에 "긴 INT"크기 접두어 - 나는 지정자의 잘못된 조합처럼 보이는 당신이

wprintf(L"[%s]\n", buf); 

퍼센트의 LS를 원하는 것이 의심 것이다. wprintf에서 찾은 문서는 's'유형 지정자가 넓은 문자열 (적어도 MS Visual Studio의 경우)을 가리키는 것으로 취급한다는 것을 나타냅니다.

+2

'% ls'과'% hs'은 유효한 [MSVC 형식 지정자]입니다 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550 (v = vs.85) .aspx). 와이드 및 "좁은"문자열입니다. 평범한'% s'을 사용하면 좀 더 미묘합니다. – DCoder

2

wsprintf()는 마이크로 소프트의 하이브리드 기능 중 하나입니다. 전처리 중에 _UNICODE이 정의되어 있는지 여부에 따라 다른 서명이 있습니다. (후드 무슨 일, 심볼의 부존재 또는 존재에 기초 wsprintfA 또는 wsprintfW으로 wsprintf를 대체하는 #ifdef있을 것이다.) _UNICODE가 정의

하면 버퍼 wchar_t[] 될 것으로 예상하고있다.

_UNICODE (일반적으로 기본값)이 정의되지 않은 경우 버퍼는 char[]이 될 것으로 예상합니다. 그것은 여기서 일어나는 일입니다. 경고가 표시되면 호환되지 않는 포인터 유형에 대한 경고가 표시됩니다. 가비지는 buf에 저장되는 8 비트 ASCII가 wprintf()에 의해 유니 코드로 해석되기 때문입니다.