c – printf(“%s”),printf(“%ls”),wprintf(“%s”)和wpri
考虑这个示例程序:
#include <cstdio> #include <cwchar> #include <string> int main() { std::string narrowstr = "narrow"; std::wstring widestr = L"wide"; printf("1 %s n",narrowstr.c_str()); printf("2 %ls n",widestr.c_str()); wprintf(L"3 %s n",narrowstr.c_str()); wprintf(L"4 %ls n",widestr.c_str()); return 0; } 其输出是: 1 narrow 2 wide 我在想: >为什么3& 4没有打印 解决方法
请注意,您正在使用C流. C流具有称为“方向”的非常特殊的质量.流是无方向,宽或窄.方向由对任何特定流的第一个输出决定(参见
http://en.cppreference.com/w/cpp/io/c了解C I / O流的总结)
在你的情况下,stdout从无方向开始,通过执行第一个printf,你设置得很窄.一旦狭窄,它就卡住了,wprintf失败了(检查它的返回码!).更改C流的唯一方法是将其自由打开,这与stdout不兼容.这就是为什么3和4没有打印. 1和3之间的区别是1是一个窄输出函数,它使用窄字符串转换说明符%s:它从char数组读取字节并将字节发送到字节流. 3是具有窄字符串转换说明符%s的宽输出函数:它首先从char数组读取字节,将mbtowcs写入wchar_ts,然后将wchar_ts发送到宽流中,然后将其写入字节或多字节序列,然后将其推送写入标准出来 最后,如果widestr在utf16,你必须使用Windows,所有的赌注都关闭;在该平台上除了ASCII之外的任何东西都支持很少.你可以给出并使用WinAPI(你可以通过标准的C 11获得一些Unicode的东西,甚至可以使用这个C输出,使用魔术字_setmode(_fileno(stdout),_O_U16TEXT)),这已经被讨论了足够的时间) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |