char*和wchar_t*的问题,分给多一点/

Amour81 2005-03-14 02:18:09
#include <clx.h>
#pragma hdrstop
#include <iostream.h>
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
char* str = new char[3];
str = "123";
int i = strlen(str);

wchar_t *wstr = new wchar_t[3];
mbstowcs(wstr, str,3);

int j = strlen((const char*)wstr);

cout << i << '\n' << j << endl;
cin.get();
}

为什么这个时候j是等于1的?



如果有一个函数funcA:
funcA(const char* ){}
我该如何把wstr作为参数传进去而又不改变wstr指向的字符串的值。用wcstombs是不可以的。

即类似于funcA( (const char*) wstr){}

当然,这样是不行的,wstr指向的值变成了‘1’而不是‘123’??
...全文
166 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
llihua 2005-03-14
  • 打赏
  • 举报
回复
1、用wcslen就不会等于1了

mbstowcs(wstr, str, 4);
int j = wcslen(wstr);
cout<<i<<'\n'<<j<<endl;

2、定义一个char[]型的临时变量作为传入参数即可

#include <iostream.h>

int main(int argc, char* argv[])
{
char* str = new char[4];
strcpy(str, "123");
int i = strlen(str);
cout<<"str: "<<str<<'\t'<<"length of str: "<<i<<endl;

wchar_t *wstr = new wchar_t[4];
mbstowcs(wstr, str, 50);
int j = wcslen(wstr);
wprintf(L"wstr: %s\tlength of wstr: %d\n", wstr, j);

char *str_2 = new char[4];
wcstombs(str_2, wstr, 50);
int k = strlen(str_2); //str_2作为传入参数
cout<<"str_2: "<<str<<'\t'<<"length of str_2: "<<i<<endl;

cin.get();
}
wangdp 2005-03-14
  • 打赏
  • 举报
回复
int j = strlen((const char*)wstr);
宽字节的"123",在内存中的存储方式应该如下
31 00 32 00 33 00 00
强制转换成单字节后,由于31后是00,因而j应该是1.
如果要在funcA中使用宽字节的参数,应该先把宽字节的
字符串转换成单字节的字符串,可用WideCharToMultiByte.
楚牛9 2005-03-14
  • 打赏
  • 举报
回复
wchar_t* ws = L"123";
int len = wcslen(ws) + 1;
char* s = new char[len];
wcstombs(s, ws, len);
funcA(s);

delete [] s;
楚牛9 2005-03-14
  • 打赏
  • 举报
回复
wchar_t* ws = L"123";
char* s = new char[wcslen(ws) + 1];
wcstombs(s, ws, 100);
funcA(s);

delete [] s;
whyglinux 2005-03-14
  • 打赏
  • 举报
回复
解释一下为什么上述变量 j 的结果为 1。

"123"中的字符转换为宽字符后的结果为 0x0031、0x0032、0x0033(原来的单个字符用两个字符表示)。在内存中的存放方式为(在Intel系列处理器上):

31 00 32 00 33 00

对于这个字符序列的 strlen 其结果显然是 1。
zhousqy 2005-03-14
  • 打赏
  • 举报
回复
八可能,函數重載八。
masterz 2005-03-14
  • 打赏
  • 举报
回复
size_t wcslen(
const wchar_t *string
);
char* 和wchar_t*不可以强制转换,对于wchar_t*有相应的w系列函数,不能能mbcs系列的函数

64,637

社区成员

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

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