2013-01-11 5 views
1

나는 리눅스에서 표준의 glibc와변화시키는 동작은

#include <stdio.h> 
wprintf(L"Hello, %s\n", "world"); 

작품, 같은 일이 newlib에와 동일한 방식으로 작동하지 않는 동안 것으로 나타났습니다. newlib는 "% s"에 대한 넓은 문자열을 예상하므로 다음과 같이 작동합니다 :

wprintf(L"Hello, %s\n", L"world"); 

올바른 동작은 무엇입니까? newlib의 버그입니까? 또한 명시 적으로 "좁은"문자열을 원한다는 printf 문자열 형식 지정자에 넓은 문자열을 지정하는 방법이 있습니까?

답변

2

넓은 문자열 (wchar_t *)에 대한 올바른 형식 지정자는 %ls이고 일반 '좁은'C 문자열 (char *)은 %s입니다. glibc의 구현은 정확합니다.

+0

결국 newlib의 버그로 밝혀졌습니다. 감사! – dragonroot

+0

@dragonroot 예. 다행 당신이 그것을 해결 :) –

1

넓은 문자열을 사용하는 표준 방법은 %ls이며 좁은 문자열을 사용하는 표준 방법은 %s입니다. newlib에 대해서는 모르지만 %s을 와이드 문자열로 잘못 처리하는 Microsoft의 wprintf은 좁은 문자열을 명시 적으로 지정하기 위해 %hs을 허용합니다. h이 무시되기 때문에 glibc에서도 작동합니다. MSVC를 전혀 타겟팅하지 않으면 %hs을 사용하는 것이 좋습니다.

출처 : http://en.chys.info/2009/06/wprintfs/