c++字符集相关,sprintf_s 工作方式

sprintf_s 是如何进行格式化字符串检查的?
在网上看见的例子:
iRt = sprintf_s(szA, 8, "%s", L"和平"); // 乱码,四个字节
iRt = sprintf_s(szA, 8, "%s", "和平"); // 和平
iRt = sprintf_s(szA, 8, "%S", L"和平"); // 零字节 -1
iRt = sprintf_s(szA, 8, "%S", "和平"); // 零字节 -1
能不能从sprintf_s函数本事检查方式及字符集方面给讲解下?尤其是倒数第二个。

4个回答

换用宽字节版的printf试试

CS_DN_huiyuan0220
CS_DN_huiyuan0220 嗯,3Q! sprintf_s 用%S时应该只能转换单字节以内的,超出范围就不能自动转为多字节。
5 年多之前 回复
guo3165935
万能意志 宽字节转单字节超过ANSI字符集肯定失败,所以sprintf_s(szA, 8, "%S", L"和平"),返回-1;printf用S只能宽字节转单字节,所以 sprintf_s(szA, 8, "%S", "和平")返回-1
5 年多之前 回复
guo3165935
万能意志 回复CS_DN_huiyuan0220:
5 年多之前 回复
CS_DN_huiyuan0220
CS_DN_huiyuan0220 宽字版的swprintf_s 也一样,iRt = swprintf_s(szW, 8, L"%S", "和平"); 这个有问题。这个应该是字符集方面的问题。
5 年多之前 回复

格式化的输出于format参数有关,%S是不存在的,无法识别并执行,返回-1

CS_DN_huiyuan0220
CS_DN_huiyuan0220 iRt = sprintf_s(szA, 8, "%S", L"well"); // well,四个字节。 这样又是可以的,区别就是 一个中文一个英文,所有应该跟字符集有关.
5 年多之前 回复
CS_DN_huiyuan0220
CS_DN_huiyuan0220 完整版的在 http://blog.csdn.net/angus_pei/article/details/8463771 ,%S 应该是存在的吧?用法应该跟sprintf 一样,是用于宽字符。MSDN 相关内容:https://msdn.microsoft.com/en-us/library/hf4y5e3w(v=vs.110).aspx
5 年多之前 回复

你需要一一对应,API跟字符集

 iRt = swprintf_s(szA, 8, L"%s", L"和平");
iRt = sprintf_s(szA, 8, "%s", "和平"); 
CS_DN_huiyuan0220
CS_DN_huiyuan0220 sprintf_s(szA, 8, "%S", L"well"); 也是可以的,不过后面的宽字符每个字符貌似不能超出单字符范围。
5 年多之前 回复

我没搞懂没什么问题啊,下面MSDN解释的很好了
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问