Chinaunix

标题: 这样把string转换到char*呢 [打印本页]

作者: hugoyg    时间: 2004-04-07 10:08
标题: 这样把string转换到char*呢
我用呢C_STR().但编译器说不能把const char* 转换到char*啊
作者: wangrujun    时间: 2004-04-07 10:31
标题: 这样把string转换到char*呢
http://bbs.chinaunix.net/forum/viewtopic.php?t=288234&highlight=wangrujun
作者: yutian    时间: 2004-04-07 10:33
标题: 这样把string转换到char*呢
直接赋值就可以了吧!!

string实际上就是一个char []

string str1="your str";
char * ch=str1;

ps:有没有string类型呀,我在c下总是报错!郁闷
作者: aero    时间: 2004-04-07 10:49
标题: 这样把string转换到char*呢
C下面没有string类型。字符串就是字符数组嘛,自己处理好了。没有单独的string类型。
作者: saiman    时间: 2004-04-08 15:31
标题: 这样把string转换到char*呢
“编译器说不能把const char* 转换到char*”。

错误原因在于const,而不在于string或者char*。

看看Thinking In C++,第八章讲得很清楚。
作者: flw    时间: 2004-04-08 15:38
标题: 这样把string转换到char*呢
用 strcpy

char cstr1[80];
string str2;

......

strcpy( cstr1, str2.c_str() );

这样子就可以了。
作者: netAnts_1979    时间: 2004-04-09 13:44
标题: 这样把string转换到char*呢
试一下
string tstr;
char *tch
tch = (char *)tstr.c_str();
作者: flw    时间: 2004-04-09 14:14
标题: 这样把string转换到char*呢
原帖由 "netAnts_1979" 发表:
试一下
string tstr;
char *tch
tch = (char *)tstr.c_str();

呵呵,你这样做就麻烦大喽!
作者: whyglinux    时间: 2004-04-09 16:05
标题: 这样把string转换到char*呢
[quote]原帖由 "hugoyg"]我用呢C_STR().但编译器说不能把const char* 转换到char*啊[/quote 发表:

这恰恰说明你的程序中还存在着设计缺陷,或者在你的使用上有问题。

例如,我们常用的字符串拷贝函数 strcpy 它的原型定义为 char *strcpy(char *dest, const char *src)。参数 src 前有 const 修饰符,表明函数调用前后中不会对 src 指向的字符串作任何改动。而 string 的成员函数 c_str() 返回的就是一个 const char* 型的字符串,所以你可以这样调用:strcpy( dest, astring.c_str() )。编译器会阻止你这样的调用:strcpy( astring.c_str(), src ),显然,这样的使用是有问题的。

如果你自己定义的函数没有加适当的 const 限定,比如把上述函数定义为:char *strcpy(char *dest, char *src),则不能再象上面所示的  strcpy( dest, astring.c_str() )那样调用函数了,因为 const char* 类型和 char* 类型不一致。但是这样的函数调用却是我们经常需要的。究其原因,是由于在函数的设计上存在缺陷,没有加适当的限定所致。

一般来说,没有必要进行 const 类型到非const类型的类型转换。如果你觉得的需要这样的转换了,首先应该检查你的程序中是否存在着上述缺陷。
作者: 求贤若渴    时间: 2004-04-09 21:57
标题: 这样把string转换到char*呢
这说明在这个类中,他的这个内部的成员可能是定义成const char *类型的,因此要对其进行强制转换,如果内部是const char *,希望复制给一个char *的变量就要这样转化。(char *)astring.c_str();
如果类的内部定义成char *,要对外部的一个const char *复制是,就可以这样进行转换 (const char *)astring.c_str();
作者: flw    时间: 2004-04-09 22:21
标题: 这样把string转换到char*呢
原帖由 "求贤若渴" 发表:
这说明在这个类中,他的这个内部的成员可能是定义成const char *类型的,因此要对其进行强制转换,如果内部是const char *,希望复制给一个char *的变量就要这样转化。(char *)astring.c_str();
如果类的内部定义..........

呵呵,你这样做就麻烦大喽!

还是用 strcpy 吧!
作者: whyglinux    时间: 2004-04-09 22:58
标题: 这样把string转换到char*呢
>;>; 这说明在这个类中,他的这个内部的成员可能是定义成const char *类型的,
不要瞎猜了,成员函数 c_str() 返回值类型就是 const char*。

>;>; 因此要对其进行强制转换,
为什么!因为是 const char*就要转换,是看着 const 不顺眼?还是设计 string 类的人是笨蛋,不把 c_str() 的返回值定义为 char* 型?

>;>; 如果内部是const char *,希望复制给一个char *的变量就要这样转化。(char *)astring.c_str();
如 flw 提醒你的,你这样做是非常危险的。我在上面也已经说过,一般没有必要把 const 类型转化为非const 类型,否则 const 也就失去其存在的必要性了。可能你刚学语言不久,或者缺乏经验,以后你会明白为什么的。
如果要复制给一个 char* 变量如 pstr 的话,这样做:strcpy( pstr, astring.c_str() )。千万不要用 (char *)astring.c_str();这样的转换,求求您了!

>;>; 如果类的内部定义成char *,要对外部的一个const char *复制是,就可以这样进行转换 (const char *)astring.c_str();
什么!你想改变 const char* 指针变量指向的字符串?你倒是试试看!前面的 const 是干什么用的,就是阻止你的这种行为的!
(第一次编辑加)我上面是说你想把 astring.c_str() 返回的字符串(不管是 char* 还是 const char*类型)复制(注意不是“赋值”)给一个 const char* 的变量的行为是错误的。见如下的代码:
  1.   const char* p = new char[128];
  2.   strcpy( p, astring.c_str() ); // 错误!因为const,不能直接通过 p 改变指向的字符串
复制代码

从上面你的帖子的内容可以看出,你的一些概念还很模糊,甚至是错误的。还需要静下心来认认真真地学习,并多思考。
作者: flw    时间: 2004-04-09 23:13
标题: 这样把string转换到char*呢
关于 const 的解释,
http://www.chinaunix.net/forum/viewtopic.php?t=143183
这个帖子说得比较清楚。

另,需要说明的一点是:

原帖由 "whyglinux" 发表:
>;>; 如果类的内部定义成char *,要对外部的一个const char *复制是,就可以这样进行转换 (const char *)astring.c_str();
什么!你想改变 const char* 指针变量指向的字符串?你倒是试试看!前面的 const 是干什么用的,就是阻止你的这种行为的!

whyglinux 的这个观点是错误的,
const char *p 的意思是说,指针变量的值是可以修改的,但是指针变量所指向的内容的值是不可以修改的。

反过来,
char * const p 才说明指针变量的值是不可以修改的。
作者: flw    时间: 2004-04-09 23:16
标题: 这样把string转换到char*呢
另外有一点请大家注意,
关于 const,有许多编译器是不敏感的,所以文中的观点没法用编程的方法实验,请参考相应的 C 标准。

我家里有一本 C99 的书,我晚上回去仔细看一下,如果我的观点有误,下周再给大家道歉!
作者: win_hate    时间: 2004-04-09 23:45
标题: 这样把string转换到char*呢
我觉得 whyglinux 的说法与 flw 的说法其实是一致的,只不过 whyglinux 的一段话有点“含胡”,使 flw 误解了他的意思

>;>; 如果类的内部定义成char *,要对外部的一个const char *复制是,就可以这样进行转换 (const char *)astring.c_str();
什么!你想改变 const char* 指针变量指向的字符串?你倒是试试看!前面的 const 是干什么用的,就是阻止你的这种行为的!


我觉得 whylinux 想说的并不是
const char *p;
p = (const char *)astring.c_str();
在语法上错。
而是:
试图修改 p 指向的对象容易导致不可预测的结果。
作者: flw    时间: 2004-04-09 23:54
标题: 这样把string转换到char*呢
[quote]原帖由 "win_hate"]试图修改 p 指向的对象容易导致不可预测的结果[/quote 发表:

p 到底指向谁,是可以修改的,但是 p 指向的内容,是不可以修改的。
所以,
const char *p;
p = (const char *)astring.c_str();
不会有任何隐患。
作者: win_hate    时间: 2004-04-10 00:06
标题: 这样把string转换到char*呢
原帖由 "flw" 发表:

p 到底指向谁,是可以修改的,但是 p 指向的内容,是不可以修改的。
所以,
const char *p;
p = (const char *)astring.c_str();
不会有任何隐患。


那段话的有个前提,
>;>; 如果类的内部定义成char *,要对外部的一个const char *复制是,就可以这样进行转换 (const char *)astring.c_str()


在执行p = (const char *)astring.c_str(); 后,就把 p 指向了一个实际可改的内存。

我觉得这会使编译器产生混淆。我再看看?
作者: whyglinux    时间: 2004-04-10 00:07
标题: 这样把string转换到char*呢
没错,我指的是“复制”行为,而不是“类型转换”行为。因为非const类型到const类型的转换是自动进行的,不需要显式转换。如你上面的给出的
  p = (const char *)astring.c_str();
完全可以写成
  p = astring.c_str();

还有,求贤若渴 提到的“复制”,可能在概念上有错误,他可能认为 const char* p = (const char *)astring.c_str(); 就是字符串的“复制”,所以有必要进行类型转换。win_hate不要受他的影响。

其实用 strcpy 对 astring.c_str() 字符串复制的时候没有必要进行类型转换的。
作者: win_hate    时间: 2004-04-10 00:10
标题: 这样把string转换到char*呢
呵呵,也有可能他把指针的赋指打成了复制。
作者: flw    时间: 2004-04-10 00:13
标题: 这样把string转换到char*呢
这个没有关系的,
例子:

char *ptr;
const char *cptr;

ptr = (char *) malloc( 1024 );  // 为便于描述,称这段内存为 mem
cptr = (const char *)ptr;

cptr 是一个常量指针,“指向的内存没法修改”这句话的意思实际上是说,“指向的内存没法通过 p 来修改”,但是可以通过其它的指针来修改。

而且,这种修改到底会不会出问题,是由 mem 本身的特性来决定的,将来就算是出了问题,也肯定是 ptr 这个指针出了问题,也绝对不会是 cptr 这个指针出问题。

既然不是 cptr 的原因,那么 cptr = (const char *)ptr; 就是合法的。
如果要说不合法,那么只能说 ptr 从一开始就指向了一个不合法的内存,并且在以后修改了它。整个过程和 cptr 毫无任何关系。
作者: win_hate    时间: 2004-04-10 00:24
标题: 这样把string转换到char*呢
应该是这样的,还是老兄头脑比较清醒。


作者: flw    时间: 2004-04-10 00:26
标题: 这样把string转换到char*呢
[quote]原帖由 "win_hate"]应改是这样的,还是老兄头脑比较清醒。[/quote 发表:

呵呵,我的早晨从中午开始,
每天早上睡到 10 点多,等上班就 11 点多了,所以熬夜是擅长。
作者: win_hate    时间: 2004-04-10 00:29
标题: 这样把string转换到char*呢
熬夜对身体不利啊,猫头鹰例外。

老兄那个即时通信的项目怎么样了?
作者: flw    时间: 2004-04-10 00:31
标题: 这样把string转换到char*呢
原帖由 "win_hate" 发表:
熬夜对身体不利啊,猫头鹰例外。

老兄那个即时通信的项目怎么样了?

太懒了,进步很慢。
最近有了一些新思路,但是也没有仔细想。
作者: leeews    时间: 2008-05-22 12:47
原帖由 flw 于 2004-4-8 15:38 发表
用 strcpy

char cstr1[80];
string str2;

......

strcpy( cstr1, str2.c_str() );

这样子就可以了。

如果这个string经常变化的话,每改变一次都要重新拷贝一次,效率上有点。。。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2