关于vswprintf函数的问题

lindenrty 2010-01-04 05:21:49
我写了个函数

int mysnwprintf(wchar_t* buffer, size_t nsize, const wchar_t* fmt, ...)
{
int ret = -1;

va_list param;
va_start(param, fmt);
ret = ::vswprintf(buffer, nsize, fmt, param);
va_end(param);

return ret;
}

void writeLog(const wchar_t* fmt, const char* file, int line, ...){
wchar_t buff[255];
::mysnwprintf(buff, sizeof(buff), L"[%s %d] : \r\n", file, line);
}


这样取得的buff写到文件是乱码
请问什么地方弄错了吗?
环境是Mac/Linux


...全文
486 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2010-01-04
  • 打赏
  • 举报
回复
哦,原来二者的格式控制符竟然还存在语义上的差别。
多谢指教。
lindenrty 2010-01-04
  • 打赏
  • 举报
回复
总算找到原因了。。。
这个问题的关键地方在于%s

在vc中swprintf的最后一个可变参数中的某个参数如果是char 那么对应的符号必须是%S大写
如果是wchar_t那么必须使用%s小写
gcc中不管是char还是wchar_t 都需要是%S大写,否则char乱码,wchar_t只输出第一位
(目前实验下来如此,但是没有资料证实)
这个是正确答案
ypb362148418 2010-01-04
  • 打赏
  • 举报
回复
你全用宽字符试试
lindenrty 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lindenrty 的回复:]
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
这个定义能使用
但是改成这个以后为何只输出了第一个字符?

L"[%s %d] : \r\n", file, line
结果是[\60]
路径只输出了第一位
[/Quote]
研究了一下%s大写%S以后解决了这个问题

但是swprintf没有办法char wchar_t混用吗?
他接受的va_list是参数列表 char wchar_t int 之类都可以阿
Windows下这个函数正常,Mac下就出问题了
lindenrty 2010-01-04
  • 打赏
  • 举报
回复
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define __WFILE__ WIDEN(__FILE__)
这个定义能使用
但是改成这个以后为何只输出了第一个字符?

L"[%s %d] : \r\n", file, line
结果是[\60]
路径只输出了第一位
晨星 2010-01-04
  • 打赏
  • 举报
回复
哦,那就不能用了。:(
lindenrty 2010-01-04
  • 打赏
  • 举报
回复
谢谢楼上的回复

#define WIDEN( X ) L ## X
writeLog("xxx", WIDEN(__FILE__), __LINE__, ……);
这个方法编译不过 提示L __FILE__未定义 多数和我的编译器有关

另外一个很奇怪的地方
swprintf(suffix, sizeof(suffix), L"[%s %d] : \r\n", file, line);
这个函数是能正常显示值的
但是这个函数必须指定参数,不能用va_list的形式。
晨星 2010-01-04
  • 打赏
  • 举报
回复
不对,直接那样定义宏不行,可能得这样:
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)

干脆再加个:
#define __WFILE__ WIDEN(__FILE__)
算了。
晨星 2010-01-04
  • 打赏
  • 举报
回复
那可能是因为WIN下的vswprintf能够直接对char串做特殊处理。
鉴于__FILE__是个常量,建议你这样试试,不过我没试过:
首先,还是改一改writeLog的定义,改成:
void writeLog(const wchar_t* fmt, const wchar_t* file, int line, ...);
然后,写一个宏:
#define WIDEN( X ) L ## X
调用的时候这样:
writeLog("xxx", WIDEN(__FILE__), __LINE__, ……);
lindenrty 2010-01-04
  • 打赏
  • 举报
回复
回楼上
file里面的值是__FILE__
这段代码在windows中没有问题,移植以后就乱码了
__FILE__有没有宽字符版本?
晨星 2010-01-04
  • 打赏
  • 举报
回复
你既然调用的是vswprintf,那传递file参数为何还用char*啊?都统一用wchar_t*就是了。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧