wsprintf输出字符串问题

edwardYang 2008-09-01 05:54:04
#include <Windows.h>
#include <stdio.h>

void main()
{
LONGLONG l = 100;

wchar_t wszBuf[200];

wsprintf(wszBuf,L"%I64u",l);

wchar_t wstr[50] = L"$MFT";
wchar_t wstr2[50];
wcscpy(wstr2,wstr);

//这样会把字符串的空间挤掉?
wsprintf(wszBuf,L"%-20lu %-10ls",l,wstr2);
}

为什么wszBuf中没有wstr2
...全文
456 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
edwardYang 2008-09-02
  • 打赏
  • 举报
回复
不知道VC6会不会有问题,回头再试试把
edwardYang 2008-09-02
  • 打赏
  • 举报
回复
谢谢各位,看来只能用I64U了,结贴
edwardYang 2008-09-02
  • 打赏
  • 举报
回复
帮帮偶啊
柯本 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
对于32位程序,%lu与%u相同,都是输出32位整数,而LONGLONG型是64位数,是两个“字长”。wsprintf根据格式字符串中的%u和%s在栈中取参数,%u表示栈中有一个32位整数,%s表示栈中有一个字符串指针(32位),所以LONGLONG型数据的低32位被认做%u对应的整数,高32位被认做%s对应的字符串指针,因高32位为0,即空指针,所以结果看起来像是wstr2被挤掉。

利用栈来传递参数时,每个参数都要占整数个“字长”,对于64位程序,每个参数至少要占64位,所以LONGLONG不会被认做两个参数,因此不会有问题。

这个问题只要把lu改成I64u就可以了。
[/Quote]

前面的分析没问题,问题是在vc7.0(vs2005)下,我用wsprintf(wszBuf,L"%I64u %-10ls",l,wstr2); 测试过,直接非法操作,就以我怀疑wsprintf对64位输出的支持.
(直接用wprintf(L"%I64u %-10ls",l,wstr2); 没问题)
cnzdgs 2008-09-01
  • 打赏
  • 举报
回复
对于32位程序,%lu与%u相同,都是输出32位整数,而LONGLONG型是64位数,是两个“字长”。wsprintf根据格式字符串中的%u和%s在栈中取参数,%u表示栈中有一个32位整数,%s表示栈中有一个字符串指针(32位),所以LONGLONG型数据的低32位被认做%u对应的整数,高32位被认做%s对应的字符串指针,因高32位为0,即空指针,所以结果看起来像是wstr2被挤掉。

利用栈来传递参数时,每个参数都要占整数个“字长”,对于64位程序,每个参数至少要占64位,所以LONGLONG不会被认做两个参数,因此不会有问题。

这个问题只要把lu改成I64u就可以了。
柯本 2008-09-01
  • 打赏
  • 举报
回复
再次测试,问题的确在wsprintf对64位的支持上.直接用wprintf没问题
柯本 2008-09-01
  • 打赏
  • 举报
回复
经测试:
bcc 6.0 支持printf 的 %Ld 但不支持 wsprintf 的 %Ld

g++ 3.42 可用printf 的 %Ld 但结果不对(与%ld相同,不支持64位), wsprintf 的 %Ld 不可用

vc 7.0 与 g++ 相同

看来,编译器对64位支持还是有些问题


yccwt 2008-09-01
  • 打赏
  • 举报
回复
不懂,但是帮顶!
柯本 2008-09-01
  • 打赏
  • 举报
回复
按理,由于l是一个__int64,所以,要用
wsprintf(wszBuf,L"%-20Lu %-10ls",l,wstr2);
但这样三个编译器都会非法操作
柯本 2008-09-01
  • 打赏
  • 举报
回复
我用vc2005/gcc3.42/bcb6.0测试,的确有问题,在最后加:
_putws(wszBuf);

即使用楼上的wsprintf(wszBuf,L"%lu %ls",l,wstr2);
结果也都是
100
----------------------------
看来要看一下生成的汇编了
study_live 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 edwardYang 的帖子:]

//这样会把字符串的空间挤掉?
wsprintf(wszBuf,L"%-20lu %-10ls",l,wstr2);
[/Quote]

"%-20lu %-10ls"是指输出的数字占20位, 且往左对齐, 这样wszBuf输出的就成了"100 $MFT "
所以看起来wstr2像没有接上

改成:wsprintf(wszBuf,L"%lu %ls",l,wstr2); 就可以看的出来了
菜牛 2008-09-01
  • 打赏
  • 举报
回复
好像没问题啊,你怎么查看的?输出来看看。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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