关于printf系列格式化输出函数,%S格式的分析

本文通过示例代码详细解析了C/C++中printf与wprintf函数在处理不同字符类型时的行为差异,特别是%s与%S格式符的区别,并解释了在未设置locale情况下输出结果的不同表现。

 

 

果去掉

setlocale(LC_ALL,"");

 

 

总结

printf("1.%S/n", swzMsg);
相当于
wprintf(L"8.%s/n", swzMsg);

可见,%S的作用是,输出一个相反类型的字符串(假设printf函数,本来接受的参数是单字节类型的,使用%S,就接受一个宽字节类型的,相当于调用了wprintf来输出)

--------------------------------------------------------------------------------------------
同理

printf("2.%S/n", szMsg);
相当于
wprintf(L"7.%s/n", szMsg);

但是这两种写法是不对的,因为传入实参类型与函数形参不匹配,导致输出乱码

---------------------------------------------------------------------------------------------

printf("3.%s/n", szMsg);

wprintf(L"5.%S/n", szMsg);

是以单字符类型输出的,所以在没有设置setlocale(LC_ALL,"");设定区位码的时候依然正确输出,

---------------------------------------------------------------------------------------------

同上上楼的道理

printf("4.%s/n", swzMsg);

相当于
wprintf(L"6.%S/n", swzMsg);

这两种写法也是错误的,因为传入实参类型与函数形参不匹配,但是这两个没有输出乱码,为什么?

因为这个是把Unicode当成单字节输出,遇到/0结束,而“Unicode测试”这个字符串U表示为0x0055,内存中是 55 00,所以遇到00就结束了,只输出U,上上楼输出乱码,是因为把单字节字符串 作为unicode输出了,Un当成一个汉字,ci当成一个汉字,不过由于内存中存储顺序的关系,貌似应该是nU 、ic当成汉字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值