请教一个字符转换的问题

Yeeler 2008-02-21 08:19:16
// 这是一个多字符向宽字符转换的代码
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char s[15] = "这搞得我头疼";
cout << s << " " << sizeof(char) << " " << sizeof(s) << endl;
wchar_t ws[1];
char *p = s;
int i;
for(i = 0; *p; ++i)
{
int len = mbtowc(&ws[i], p, MB_CUR_MAX);
p += len;
}
//delete []p;
ws[i] = L'\0 ';
wcout << ws << " " << sizeof(wchar_t) << " " << sizeof(ws) << endl;
getchar();
return 0;
}

输出结果是:
这搞得我头疼 1 15
这搞得我头疼 2 2

ws[1] 只有2个字符长度,转换后怎么会显示这么多啊。
还有,我这么写是不是还要释放指针啊,可为什么我一释放,就会出现弹出错误,但程序结果会显示Debug Assertion Failed!
...全文
123 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可是1都够了 这里的1就能输出6个汉字 这是怎么回事啊

你越界了,而后面正好是空白的内存,所以正常使用了,
你的代码是
wcout<<ws<<" "<<sizeof(wchar_t)<<" "<<sizeof(ws)<<endl;
因为你wchar_t ws[1];
而sizeof(ws)返回的是数组占的大小,2字节.
Yeeler 2008-02-22
  • 打赏
  • 举报
回复
顶上去
Yeeler 2008-02-22
  • 打赏
  • 举报
回复
输出结果是:
这搞得我头疼 1 15
这搞得我头疼 2 2

第一个好理解 1个字节 15个字节长度 最多可以显示14个字符或者7个汉字 在本例中s[13]也就够了
第二个就不明白了 第一个“2” 应该是2个字节的意思吧 第二个“2”呢? 我最后输出的宽字符有6个汉字,最起码也要13个字节或者7个双字吧 大家说说吧,程序输出真的是这样 不信可以试试。
Yeeler 2008-02-22
  • 打赏
  • 举报
回复
呵呵 总算明白了 编译器不报错,我就认为自己写的对的。
然后一直在想明明长度7的数组 怎么存长度13的数据。

谢谢 akirya
Yeeler 2008-02-22
  • 打赏
  • 举报
回复
明白了 原来是sizeof 和strlen wcslen之间的区别
这里有详细的解释
http://www.360doc.com/showWeb/0/0/159827.aspx

这里非常感谢akirya hohoo

完整代码如下:

#include "stdlib.h"
#include "stdio.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
char s[] = "这搞得我头疼";
char t[3];
t[0]=s[0];
t[1]=s[1]; // ‘这’ char类型
t[2]='\0'; // 字符串结束
cout<<s<<" "<<sizeof(char)<<" "<<sizeof(s)<<" "<<strlen(s)<<" "<<t<<endl;
wchar_t ws[7];// 随便设置,数组大小只有7喔
wchar_t wt[13]; // 定义一个实际需要的 以双字节显示数组s的数组
char *p = s;
int i;
for(i = 0; *p; ++i) // 在*p没有走到数组s最后,循环不会停,也就是说i=13才退出循环
{
int len = mbtowc(&ws[i], p, MB_CUR_MAX); // 于是ws越界了,定义只定义了长度7
p += len;
}
ws[i] = L'\0 ';

// 我们把数据复制到另外一个数组,就可以清晰的看到确实单字节变双字节了。
wt[0] = ws[0];
wt[1] = ws[1]; // 这 wchar_t类型
wt[2] = ws[2];
wt[3] = ws[3]; // 搞
wt[4] = ws[4];
wt[5] = ws[5]; // 的
wt[6] = ws[6];
wt[7] = ws[7]; // 我
wt[8] = ws[8];
wt[9] = ws[9]; // 头
wt[10] = ws[10];
wt[11] = ws[11]; // 疼
wt[12] = L'\0';
wcout<<ws<<" "<<sizeof(wchar_t)<<" "<<sizeof(ws)<<" "<<wcslen(ws) <<" "<<wt<<endl;
getchar();
return 0;
}



获得结果:

这搞得我头疼 1 13 12 这 // 1 char占一个字节; 13 数组s的长度是13字节; 12 字符串长度是12
这搞得我头疼 2 14 12 这搞得我头疼 // 2 wchar_t占2个字节; 14 数组sw的长度是14字节;12 字符串的长度是12



现象:越界数组ws[7]和wt[13]显示的相同。编译器不会对数组越界报错。
结论:编译器不会对char类型数组做越界的检查,需要作者自己注意。我想这也是为什么C/C++被人称为灵活,但稍有不慎会出现内存溢出。
这是我的想法,我是个C++初学者,大家有什么想法,请跟帖。

Yeeler 2008-02-21
  • 打赏
  • 举报
回复
wchar_t ws[1];//这个到底分配了多少空间啊,2个字节32位,可为什么能显示6个汉字啊
Yeeler 2008-02-21
  • 打赏
  • 举报
回复
wchar_t ws[15];//内存要分配够长

可是1都够了 这里的1就能输出6个汉字 这是怎么回事啊
AngelDevil 2008-02-21
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复

#include "stdlib.h"
#include "stdio.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
char s[15] = "这搞得我头疼";
cout<<s<<" "<<sizeof(char)<<" "<<strlen(s)<<endl;
wchar_t ws[15];//内存要分配够长
char *p = s;
int i;
for(i = 0; *p; ++i)
{
int len = mbtowc(&ws[i], p, MB_CUR_MAX);
p += len;
}
//delete []p;
ws[i] = L'\0 ';
wcout<<ws<<" "<<sizeof(wchar_t)<<" "<<wcslen(ws)<<endl;
getchar();
return 0;
}
Yeeler 2008-02-21
  • 打赏
  • 举报
回复
mbstowcs 怎么用的啊 能给个例子吗?
还有 ws[1] 只有2个字符长度,转换后怎么会显示这么多啊。

谢谢大家了
  • 打赏
  • 举报
回复
为啥不用mbstowcs?
你释放指针的时候看看数值,是否和你分配之后的结果是一样的?
csdn5211 2008-02-21
  • 打赏
  • 举报
回复
1、没明白你什么意思。
2、没有new,你为啥要delete呢?

64,849

社区成员

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

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