微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – printf(“%s”),printf(“%ls”),wprintf(“%s”)和wprintf(“%ls”)之间有什么区别?

考虑这个示例程序:
#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没有打印
> 1& 3,2& 4之间的区别是什么.
>如果在utf8中是narrowstr,而utf16中的widestr是否有差异呢?

解决方法

请注意,您正在使用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)),这已经被讨论了足够的时间)

原文地址:https://www.jb51.cc/c/114875.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐