在不同的libc实现中wprintf()中“%s”的不同行为

时间:2013-01-11 06:31:51

标签: c unicode printf glibc newlib

我注意到了,而

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

在Linux下使用标准glibc,同样的方法与newlib的工作方式不同。似乎newlib期望那里有“%s”的宽字符串,所以以下工作代替:

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

哪种行为是正确的?这是newlib中的错误吗?另外,有没有办法明确指定我想要一个“窄”字符串,而不是printf字符串格式说明符中的宽字符串?

2 个答案:

答案 0 :(得分:2)

宽字符串(wchar_t *)的正确格式说明符为%ls,正常情况下,“窄”C字符串(char *)为%s。 glibc的实现是正确的。

答案 1 :(得分:1)

%ls使用宽字符串的标准方法是正确的,%s是使用窄字符串的标准方法。我不知道newlib,但是微软的wprintf也错误地将%s视为宽字符串,接受%hs来明确指定一个窄字符串。它也适用于glibc,因为忽略了h。如果您要定位MSVC,则可能需要使用%hs

来源:http://en.chys.info/2009/06/wprintfs/