谁能解释一下c_str()的怪现象

gallardo 2006-11-22 10:45:57
char *x,*y;
x = Edit1->Text.c_str();
y = Edit2->Text.c_str();
ShowMessage(x);
ShowMessage(y);

执行到"x=..."这行时x的值是对的,执行"y=..."后x的值变成了y的值也就是Edit2->Text,而在ShowMessage后便截去了最后一位。

如果使用AnsiString是正常的
...全文
262 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenLeak 2006-11-22
  • 打赏
  • 举报
回复
c_str() 是临时变量,AnsiString 无效之后就不知道是什么值了

不过这个问题倒是大概 3 个月就会有人提出来的
看看这个函数的帮助就知道得很清楚了
gallardo 2006-11-22
  • 打赏
  • 举报
回复
倒不是我非要这么用,我只是偶然测试时发现的。
我想不通,先不说ShowMessage吧。

只是在对y赋值后x的值怎么也成了y的值?
donwmufromdying 2006-11-22
  • 打赏
  • 举报
回复
MEFULEU(没有作不到,只有想不到) (的做法比较好
donwmufromdying 2006-11-22
  • 打赏
  • 举报
回复
给你个建议:char *x,*y;都先初始化一下(分配空间)。要么最好这么定义!
char x[256],y[256]
myy 2006-11-22
  • 打赏
  • 举报
回复
这不是怪,是因为根本就不能这样用。

不说了,关于c_str()的话题真是“钻石恒久远,一颗永流传”......
  • 打赏
  • 举报
回复
x = Edit1->Text.c_str();
运行过这一行时Edit1->Text.c_str()的值已经无效了,所以你用就是错误的。
是否能打印出来取决于标准库string的实现。

MEFULEU 2006-11-22
  • 打赏
  • 举报
回复
没这么用过,我一般都这么使用:

char *x;
x=new char[Edit1->Text.Length()+1];

strcpy(x,Edit1->Text.c_str());

ShowMessage(AnsiString(x));

delete []x;
FFSB 2006-11-22
  • 打赏
  • 举报
回复
Edit1->Text.c_str();
=>Edit1->GetText().c_str();
AnsiString __fastcall TControl::GetText(void)
{
AnsiString Str;
;;;;;;;;;
return Str;
}
FFSB 2006-11-22
  • 打赏
  • 举报
回复
也就是说在Text非空时Edit1->Text.c_str();返回一个临时指针
不过原因不在c_str()
wangxintu 2006-11-22
  • 打赏
  • 举报
回复
c_str() 的帮助中有说明这种情况
FFSB 2006-11-22
  • 打赏
  • 举报
回复
class RTL_DELPHIRETURN AnsiString
{
。。。
char* __fastcall c_str() const { return (Data)? Data: "";}
};

看看dstring.h的实现LS有什么话说?!
wood542344 2006-11-22
  • 打赏
  • 举报
回复
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. That is,don't do something like this:

char* cp = Edit1->Text.c_str();
char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid


If you need a persistent pointer, you MUST copy the string into its own buffer:

char* cp = new char[ Edit1->Text.Length() + 1 ];
strcpy( cp, Edit1->Text.c_str() );
这个在帮助里说得很清楚了。.c_str返回一个非常量的临时指针。
daydayup234 2006-11-22
  • 打赏
  • 举报
回复
关于c_str()的话题
都是AnsiString引的是非
FFSB 2006-11-22
  • 打赏
  • 举报
回复
BenLeak(摇摆人)说的不正确:

->Text是临时变量
.c_str()是这个临时对象内部的一个指针
hk_c 2006-11-22
  • 打赏
  • 举报
回复
我也碰到过

lailaiququ 2006-11-22
  • 打赏
  • 举报
回复
AnsiString 是个类,重载了 =,用起来很方便,但刚开始会造成一些误解。

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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