wsprintf如何格式输出?

wang37921 2010-04-14 09:25:37
TCHAR FPSString[9];
float FPS = 3.1416;
wsprintf(FPSString, L"%f", FPS);
输出的是f。。。
大侠们起床了~
...全文
344 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang37921 2010-04-14
  • 打赏
  • 举报
回复
.。。。娃娃啊哇~我又傻了~老大做饭去吧~别理我了。。。strcpy~唉~
我可是×××的男人啊~
老大~中午加道菜奖励下自己~荤的啊~算我的~呵呵~
昵称很不好取 2010-04-14
  • 打赏
  • 举报
回复
还有,那如果是在堆上面分配的~char* a = new char[2];
a = "1q2";
——不能这样用,你这不是给指针所指空间赋值,而是让指针a重新指向常量区的字符串,造成原来的内存空间泄漏

为啥这里手动 a[1] = '\0';
—— 这是在常量区,当然不能改

可以像下面这样:
char *a = new char[2];
strcpy(a,"h"); —— 因为a所指空间只有2个字节,别越界了,字符串最后是'\0'
wang37921 2010-04-14
  • 打赏
  • 举报
回复
z大也不详细说了~55555555555不过这的确很难解释吧~
自己mark下~
http://topic.csdn.net/t/20030818/09/2158215.html
z大~等会再做饭啊~最后一个问题~
上面地址他们讨论的
下面摘的菜农的回答~是不是正中啊~

还有,那如果是在堆上面分配的~char* a = new char[2];
a = "1q2";
为啥这里手动 a[1] = '\0';
会报错啊。。。
SprintfWchar.exe 中的 0x0041141b 处未处理的异常: 0xC0000005: 写入位置 0x00415753 时发生访问冲突


3 楼zzyx(菜农)
char b[9];
空间分配在程序栈上,任何的超过其长度的操作都会引起异常

而char *ss=new char[9];空间分配在堆上
如果指针超出分配的长度,不一定会有异常的。

16 楼zzyx(菜农)

还没清楚?
你的ss分配在heap上,不是stack上。

“Run-Time Check Failure #2 - Stack around the variable 'b' was corrupted.”

正说明你在9个长度的栈空间上,要覆盖上去10个字符(包括了一个null)
……而栈被重写可能会造成严重的问题,因此运行环境报告了这个异常。

对于ss,你分配了9个长度的堆空间上,你覆盖上去10个字符(包括了一个null),没有
报错,不等于没有错!!!
例如,假设你的代码new了一个空间A,长度为8,操作系统可能给你的地址是1000
假如你再new了一个空间B,长度为8,那么操作系统可能给你的地址是1008

现在你要对A空间strcpy一个9字节长(包括了null)的串,那么实际上这个串将
占据1000~1008的空间,也就是说,你的B中的数据被破坏了!
那么再这个情况下可能不会异常,只是你的运行结果不一定是你想要的东西了

假设B不是你分配的空间,而是你的运行程序的函数库或者操作系统自动new出来的
那么,如果你破坏了B,就有可能异常。

前边有dx说的非常清楚,没有报告异常不等于没有错误!


哎,哪位把strcpy的实现和程序栈和堆的概念讲给楼主吧



昵称很不好取 2010-04-14
  • 打赏
  • 举报
回复
你的temp只有4字节大小,放不下FPS
wang37921 2010-04-14
  • 打赏
  • 举报
回复
z大~刚才你的代码改了点~就会出那个stack错误了~
temp太小~
为啥会这样?怎么解决?

WCHAR FPSString[9] = {0};
char temp[4] = {0};
float FPS = 3.141611;
sprintf(temp,"%f",FPS);
mbstowcs(FPSString,temp,strlen(temp));
temp[3] = '\0';
wprintf(L"%s\0",FPSString);
wang37921 2010-04-14
  • 打赏
  • 举报
回复
。。。谢谢first老大的不厌其烦~现在遇见个
Run-Time Check Failure #2 - Stack around the variable 'testSZ' was corrupted.
这个错误~我先看看~有啥不懂的~等会再问大哥~请大哥关注下啊~~
昵称很不好取 2010-04-14
  • 打赏
  • 举报
回复
建议用MultiByteToWideChar和WideCharToMultiByte
mbstowcs和wcstombs 对中文支持不好
wang37921 2010-04-14
  • 打赏
  • 举报
回复
MultiByteToWideChar和WideCharToMultiByte
mbstowcs和wcstombs
又有什么区别啊?
。。。
昵称很不好取 2010-04-14
  • 打赏
  • 举报
回复
可以试试下面两个函数: MultiByteToWideChar和WideCharToMultiByte
自己MSDN吧
wang37921 2010-04-14
  • 打赏
  • 举报
回复
wcstombs。。。。
这英文缩的。。。
wang37921 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 thefirstz 的回复:]
可以了,mbstowcs函数中转一下~~
...
[/Quote]
。。。。哪位大仙上的身啊。。。。
我也要~呵呵~
wchar到char的有没有啊?
怎么查到的?msdn上有~但是用什么关键字查到这个函数的?
昵称很不好取 2010-04-14
  • 打赏
  • 举报
回复
可以了,mbstowcs函数中转一下~~


//函数声明如下:
/*
size_t mbstowcs(
wchar_t* wcstr,
const char* mbstr,
size_t count
);
*/
//用法:
TCHAR FPSString[9] = {0};
char temp[10] = {0};
float FPS = 3.1416;
sprintf(temp,"%f",FPS);
mbstowcs(FPSString,temp,strlen(temp));

wprintf(L"%s\n",FPSString);
昵称很不好取 2010-04-14
  • 打赏
  • 举报
回复
wsprintf函数好像不支持%f,%d倒是支持
	TCHAR FPSString[9] = {0};
int i = 999;
wsprintf(FPSString, L"%d",i);
wprintf(L"%s\n",FPSString);
wang37921 2010-04-14
  • 打赏
  • 举报
回复
那想输入浮点怎么办啊?%多少》?
意图很明显吧~想要wsz存这个浮点数~

#include <Windows.h>
int main()
{
WCHAR wsz[9];
float fl = 3.1416;
wsprintfW(wsz, L"%d", fl);
}

这样还会报这个错
Run-Time Check Failure #2 - Stack around the variable 'wsz' was corrupted.
为什么?
还有~大侠贴控制台的代码上来看看吧~谢谢了~
zqlclj 2010-04-14
  • 打赏
  • 举报
回复
wsprintf中貌似不能用"%f"
wang37921 2010-04-14
  • 打赏
  • 举报
回复
。。。不懂。。。现实点好不好~。。。
  • 打赏
  • 举报
回复
int wsprintf(          LPTSTR lpOut,    LPCTSTR lpFmt,     ...);
  • 打赏
  • 举报
回复
呵呵


起来很久了

65,187

社区成员

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

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