LPCSTR 和 string互相转换

uiovbnda 2004-11-23 10:25:05
string h[10];
void aa(LPCSTR s[10])
{
h[1]=s[1];
}
Void b()
{
MessageBox(NULL, h[1].c_str(),"Error",MB_OK);
}

aa(kkk);
//kkk是一组已经有内容的数组

为什么当我kkk这组数组里面是数字或是英文的时候
跳出来的窗口没什么问题,可以正常显示. 数字或是英文

但是当kkk里面其中一组数据有中文时,例如kkk[3]=”中文”;
跳出来的窗口就没有东西显示了(连带影响到kkk其它数据?)
这是什么道理?
请问怎么转换或是解决?










...全文
1839 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cadinfo 2004-11-24
CString strMyString;
(LPCTSTR)(LPTSTR)strMyString;
回复
Mr-Chen 2004-11-24
检查一下你的kkk地址有没有错误,以下是我的测试代码,没有问题,可以正常显示:

string h[2];
LPCSTR kkk[2];

void CMainFrame::OnOK(UINT nID)
{
kkk[1] = "我是";
aa(kkk);
MessageBox(h[1].c_str(),"Error",MB_OK);
}
void CMainFrame::aa(LPCSTR s[2])
{
h[1]=s[1];
}
回复
LoveBluck 2004-11-24
试试通过CString转换
回复
Ah 2004-11-24
h[1] = s;
回复
lgh21cn 2004-11-24
使用wcscpy(h, s)试试,因为中文是Unicode的字符,占2个字节,而数字和英文默认是占一个字节。LPCSTR是Unicode字符集的类型
回复
weakwater 2004-11-24
都可以转换成char*
就把char*作为过渡就可以了吧
回复
uiovbnda 2004-11-23
1. 我必须一定要显示出来”中文字符串”
奇怪的是,为什么,那个LPCSTR数组里,只要有一个位置是中文字符串
其它全部的都被影响到?全部不能显示
但是把那个中文字符串拿掉,换英文或数字取代,又正常了
2. 我只能用STRING 不能用CSTRING
如果可以用CSTRING 我想不用转换那么多了.

希望可以得到解答,马上结帖!
回复
zyg158 2004-11-23
中文是双字符,你如果将其中的一个双字符中的其中一半改变后,显示结果将影响到其它的内容。因为系统无法识别其它的是双字符还是单字符,就只能按照单字符显示了,所以一般都是乱码或不可见。但是其它的数组内的内容还是原来的内容,并没有改变,只不过是显示不出来罢了
回复
zyg158 2004-11-23
BSTR 型转化成 CString 型

  由于 BSTR 是记数 Unicode 字符串,你可以用标准转换方法来创建 8 位的 CString。实际上,这是 CString 内建的功能。在 CString 中 有特殊的构造函数可以把 ANSI 转化成 Unicode,也可以把Unicode 转化成 ANSI。你同样可以从 VARIANT 类型的变量中获得 BSTR 类型的字符串,VARIANT 类型是 由各种 COM 和 Automation (自动化)调用返回的类型。

例如,在一个ANSI程序中:

BSTR b;
b = ...; // whatever
CString s(b == NULL ? L"" : b)
  对于单个的 BSTR 串来说,这种用法可以工作得很好,这是因为 CString 有一个特殊的构造函数以LPCWSTR(BSTR正是这种类型) 为参数,并将它转化成 ANSI 类型。专门检查是必须的,因为 BSTR 可能为空值,而 CString 的构造函数对于 NULL 值情况考虑的不是很周到,(感谢 Brian Ross 指出这一点!)。这种用法也只能处理包含 NUL 终结字符的单字符串;如果要转化含有多个 NULL 字符 串,你得额外做一些工作才行。在 CString 中内嵌的 NULL 字符通常表现不尽如人意,应该尽量避免。
  根据 C/C++ 规则,如果你有一个 LPWSTR,那么它别无选择,只能和 LPCWSTR 参数匹配。

在 Unicode 模式下,它的构造函数是:

CString::CString(LPCTSTR);
正如上面所表示的,在 ANSI 模式下,它有一个特殊的构造函数:

CString::CString(LPCWSTR);
  它会调用一个内部的函数将 Unicode 字符串转换成 ANSI 字符串。(在Unicode模式下,有一个专门的构造函数,该函数有一个参数是LPCSTR类型——一个8位 ANSI 字符串 指针,该函数将它加宽为 Unicode 的字符串!)再次强调:一定要检查 BSTR 的值是否为 NULL。
  另外还有一个问题,正如上文提到的:BSTRs可以含有多个内嵌的NULL字符,但是 CString 的构造函数只能处理某个串中单个 NULL 字符。 也就是说,如果串中含有嵌入的 NUL字节,CString 将会计算出错误的串长度。你必须自己处理它。如果你看看 strcore.cpp 中的构造函数,你会发现 它们都调用了lstrlen,也就是计算字符串的长度。
  注意从 Unicode 到 ANSI 的转换使用带专门参数的 ::WideCharToMultiByte,如果你不想使用这种默认的转换方式,则必须编写自己的转化代码。
  如果你在 UNICODE 模式下编译代码,你可以简单地写成:


CString convert(BSTR b)
{
if(b == NULL)
return CString(_T(""));
CString s(b); // in UNICODE mode
return s;
}

  如果是 ANSI 模式,则需要更复杂的过程来转换。注意这个代码使用与 ::WideCharToMultiByte 相同的参数值。所以你 只能在想要改变这些参数进行转换时使用该技术。例如,指定不同的默认字符,不同的标志集等。 CString convert(BSTR b)
{
CString s;
if(b == NULL)
return s; // empty for NULL BSTR
#ifdef UNICODE
s = b;
#else
LPSTR p = s.GetBuffer(SysStringLen(b) + 1);
::WideCharToMultiByte(CP_ACP, // ANSI Code Page
0, // no flags
b, // source widechar string
-1, // assume NUL-terminated
p, // target buffer
SysStringLen(b)+1, // target buffer length
NULL, // use system default char
NULL); // don''t care if default used
s.ReleaseBuffer();
#endif
return s;
}

  我并不担心如果 BSTR 包含没有映射到 8 位字符集的 Unicode 字符时会发生什么,因为我指定了::WideCharToMultiByte 的最后两个参数为 NULL。这就是你可能需要改变的地方。
回复
uiovbnda 2004-11-23
不是这个问题啦
我里面写这样只是简化程序的内容
简单表达出来
回复
3m2u 2004-11-23
void aa(LPCSTR s[10])
{
for(int i=0;i<10;i++)
h[i]=s[i];
}
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-11-23 10:25
社区公告

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