vs2008下几个CString转换char*的问题

clayluo 2008-06-06 10:30:49
几个CString转换的问题,这个问题折磨了我两天的,以下代码是我参考网上给出的n种方法,居然没有一个可以的,看来我的vs2008进步了很多!
char *p_list = NULL;
char *p_ins = NULL;
char *p_temp =NULL;
char tlist[100];
CString s("This is a test");

//way1: CString to char*
p_list = (LPTSTR)(LPCTSTR)s;
//VS2008 compile error: 无法从“LPTSTR”转换为“char *”

//way2: CString to char*
p_temp= s.GetBuffer(0);
strcpy(p_list,p_temp);//CString->char*
s.ReleaseBuffer(-1);
//VS2008 compile error: 无法从“wchar_t *”转换为“char *”

//way2: CString to char*
p_temp= s.GetBuffer(s.GetLength());
strcpy(p_list,p_temp);//CString->char*
s.ReleaseBuffer();
//VS2008 compile error: 无法从“wchar_t *”转换为“char *”

//way3:
p_list = (char*)s;
//error:无法从“CString”转换为“char *”

//way4:
p_list= new char[s.GetLength()+1];
strcpy(p_list,(LPCSTR)s);
//error:无法从“CString”转换为“LPCSTR”

//CString to char[]
strcpy(tlist,(char *)(const char*)s);
//VS2008 compile error: 无法从“CString”转换为“const char *”
...全文
4505 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaoruiyan 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
C/C++ code

如果你不是unicode环境,
char* 不是用CString填进去的,应该是这样
CString szParA;
CString szParB;
假设接口是:
fun(char* ParA, char* parB);
那么应该写作:
fun(szParA.GetBuffer(0), szParB.GetBuffer(0);

如果是unciode的……
[/Quote]
强悍!非常感谢您提供了这么好的方法!
LZNJ06 2012-06-19
  • 打赏
  • 举报
回复
14楼也能解决问题。用了错误提示没有了。。
barber1 2011-05-26
  • 打赏
  • 举报
回复
这样也可以,我试过了
CString str=_T("这是我的测试程序。");// 先得到要转换为字符的长度
const size_t strsize=(str.GetLength()+1)*2; // 宽字符的长度;
char * pstr= new char[strsize]; //分配空间;
size_t sz=0;
wcstombs_s(&sz,pstr,strsize,str,_TRUNCATE);
int n=atoi(const char*)pstr); // 字符串已经由原来的CString 转换成了 const char*

//没有这番转换会报错,无法将LPCTSTR或CString 转换为const char*,每次转换都要写一堆上面的过程

qwdongliuxuan 2011-03-15
  • 打赏
  • 举报
回复
13楼正解,核心是用WideCharToMultiByte函数进行转换
雪域迷影 2011-02-25
  • 打赏
  • 举报
回复
我也碰到这个问题了,在VC++ 2005下CString转化成char *让我头都大了,
还没解决,郁闷啊!

void CCaculatorADDDlg::OnBnClickedButtonequal()
{
// TODO: 在此添加控件通知处理程序代码
CString cNum1,cNum2,cNum3;//char应该改为什么合适?WCHAR,TCHAR
GetDlgItemText(IDC_EDIT1,cNum1);
GetDlgItemText(IDC_EDIT2,cNum2);
int f1 = atoi(cNum1);
int f2 = atoi(cNum2);
int f3 = f1 + f2;

itoa(f3,cNum3,10);
SetDlgItemText(IDC_EDIT3,cNum3);
}



大家能帮忙看看吧!
太难想 2010-09-03
  • 打赏
  • 举报
回复
学习,学习,以前找到个方法忘记了
talent_zhaozihu 2010-07-13
  • 打赏
  • 举报
回复
wcstombs 可以将宽字符 转换为 char类型字符
mbstowcs 可以将char类型转换为宽字符类型
alivio 2009-09-28
  • 打赏
  • 举报
回复
good.正在找呢
liuxianming2001 2008-08-23
  • 打赏
  • 举报
回复
好贴,刚碰到此问题
添一点内容:

使用 Unicode 数据
Unicode 标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案。所有的计算机都用单一的 Unicode 标准 Unicode 数据中的位模式一致地翻译成字符。这保证了同一个位模式在所有的计算机上总是转换成同一个字符。数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。

对于用一个字节编码每个字符的数据类型,存在的问题之一就是此数据类型只能表示 256 个不同的字符。这就迫使对于不同的字母表(例如相对较小的欧洲字母表)采用多重编码规格(或者代码页)。而且也不可能处理象日文汉字或韩国文字这样具有数千个字符的字母表。
zjz8204 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 clayluo 的回复:]
引用 8 楼 zjz8204 的回复:
用cstring的insert可以不?

前几天我也做这个了,然后就用这玩意解决的,挺好

楼主给两分吧,不要太多,哈哈

这个帖子放到明天可以加100分,可以给你更多,呵呵,但前提是给出具体的代码
[/Quote]

呵呵,具体的代码,就是用CString类的Insert函数了分多少没关系的,一分不给也还是要回。

我是带着满腔的热血,学习来的
kxj_72 2008-06-09
  • 打赏
  • 举报
回复
你在使用编程工具编写Code时,要注意其编译环境(这里主要是指对字符的配置)。
char、wchar_t、CString,他们的单位字节数据是不同的,所对应的标准函数也是有区别的
如果,在复制问题上,想一概通吃,可以使用memcpy函数。
season030441 2008-06-09
  • 打赏
  • 举报
回复
是不是(LPSTR)(LPCTSTR)str啊
clayluo 2008-06-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wutaihua 的回复:]
C/C++ code如果你不是unicode环境,char*不是用CString填进去的,应该是这样
CString szParA;
CString szParB;
假设接口是:
fun(char*ParA,char*parB);
那么应该写作:
fun(szParA.GetBuffer(0), szParB.GetBuffer(0);

如果是unciode的编译环境
CString szParA;
CString szParB;

假设接口是:
fun(char*ParA,char*parB);

那么需要先转换为多字节字符串,然后才可以作为参数填写进去:
如果是wchar_t转换为char接口的可以用这个…
[/Quote]
不错,还有没有人补充?
菜牛 2008-06-06
  • 打赏
  • 举报
回复
前面说了,设置字符集(不用UNICODE)是最简单的方法;如果在UNICODE下面,字符串就必须进行转换。当然,还有一种情况,就是用UNICODE版本的字符串函数。另外,也许不需要转化呢?比如完全按照字节(不是字符)处理的函数,直接把内存指针强制转换为char*就可以了。
greatws 2008-06-06
  • 打赏
  • 举报
回复
右键解决方案->属性->常规->使用多字节字符集
clayluo 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zjz8204 的回复:]
用cstring的insert可以不?

前几天我也做这个了,然后就用这玩意解决的,挺好

楼主给两分吧,不要太多,哈哈
[/Quote]
这个帖子放到明天可以加100分,可以给你更多,呵呵,但前提是给出具体的代码
clayluo 2008-06-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ouyh12345 的回复:]
设置字符集是最简单的方法了
在做开发的时候,我们要选择字符集,既是使用unicode,还是使用多字节
[/Quote]
非常感谢ouyh12345,
我的配置管理器显示是选择使用 Unicode 字符集;
不知道在程序中怎么重新设定字符集,设置好了后这些代码是不是不用改就能编译?
zjz8204 2008-06-06
  • 打赏
  • 举报
回复
用cstring的insert可以不?

前几天我也做这个了,然后就用这玩意解决的,挺好

楼主给两分吧,不要太多,哈哈
ouyh12345 2008-06-06
  • 打赏
  • 举报
回复
//CString to char[]
当然是转化成char*,然后再拷贝了

//way5:
sprintf(p_list,(LPCTSTR)s);

有这样的用法吗?
得:
sprintf(p_list, "%s", s.GetBuffer(s.GetLength()));
s.ReleaseBuffer();
clayluo 2008-06-06
  • 打赏
  • 举报
回复
还有一个是转char[]的问题也帮看看。
//CString to char[]
strcpy(tlist,(char *)(const char*)s);
//VS2008 compile error: 无法从“CString”转换为“const char *”

又一种方法:
//way5:
sprintf(p_list,(LPCTSTR)s);
//error:不能将参数 2 从“LPCTSTR”转换为“const char *”
加载更多回复(7)

16,471

社区成员

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

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

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