谁能解释一下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是正常的
...全文
268 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 是个类,重载了 =,用起来很方便,但刚开始会造成一些误解。
软件编程规范培训实例与练习 软件编程规范培训实例与练习  问题分类 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和环境、其他函数、全局/局部变量或数据变量之间的数据/控制传输不匹配的问题,在系统中起重要作用,将导致模块间配合失效等严重问题; 维护类问题(C类)-指设计、编码中出现的对软件系统的维护方便程度造成影响的问题,在系统中不起关键作用,但对系统后期维护造成不便或导致维护费用上升; 可测试性问题(D类)-指设计、编码中因考虑不周而导致后期系统可测试性差的问题。  处罚办法 问题发生率: P=D/S D=DA+0.5DB+0.25DC 其中: P -问题发生率 D -1个季度内错误总数 DA -1个季度内A类错误总数 DB -1个季度内B类错误总数 DC -1个季度内C类错误总数 S -1个季度内收到问题报告单总数 1)当D≥3时,如果P≥3%,将进行警告处理,并予以公告; 2)当D≥5时,如果P≥5%,将进行罚款处理,并予以公告。 目 录 一、逻辑类代码问题 第5页 1、变量/指针在使用前就必须初始化 第5页 【案例1.1.1】 第5页 2、防止指针/数组操作越界 第5页 【案例1.2.1】 第5页 【案例1.2.2】 第6页 【案例1.2.3】 第7页 【案例1.2.4】 第8页 3、避免指针的非法引用 第9页 【案例1.3.1】 第9页 4、变量类型定义错误 第10页 【案例1.4.1】 第10页 5、正确使用逻辑与&&、屏蔽&操作符 第17页 【案例1.5.1】 第17页 6、注意数据类型的匹配 第18页 【案例1.6.1】 第18页 【案例1.6.2】 第18页 7、用于控制条件转移的表达式及取值范围是否书写正确 第20页 【案例1.7.1】 第20页 【案例1.7.2】 第21页 【案例1.7.3】 第22页 8、条件分支处理是否有遗漏 第24页 【案例1.8.1】 第24页 9、引用已释放的资源 第26页 【案例1.9.1】 第26页 10、分配资源是否已正确释放 第28页 【案例1.10.1】 第28页 【案例1.10.2】 第29页 【案例1.10.3】 第30页 【案例1.10.4】 第32页 【案例1.10.5】 第33页 【案例1.10.6】 第35页 【案例1.10.7】 第38页 11、防止资源的重复释放 第39页 【案例1.11.1】 第39页 12、公共资源的互斥性和竞用性 第40页 【案例1.12.1】 第40页 【案例1.12.2】 第40页 二、接口类代码问题 第43页 1、对函数参数进行有效性检查 第43页 【案例2.1.1】 第43页 【案例2.1.2】 第43页 【案例2.1.3】 第44页 【案例2.1.4】 第46页 【案例2.1.5】 第47页 【案例2.1.6】 第48页 2、注意多出口函数的处理 第49页 【案例2.2.1】 第49页 三、维护类代码问题 第51页 1、 统一枚举类型的使用 第51页 【案例3.1.1】 第51页 2、 注释量至少占代码总量的20% 第51页 【案例3.2.1】对XXX产品BAM某版本部分代码注释量的统计 第51页 四、产品兼容性问题 第52页 1、系统配置、命令方式 第52页 【案例4.1.1】 第52页 【案例4.1.2】 第53页 2、设备对接 第54页 【案例4.2.1】 第54页 3、其他 第55页 【案例4.3.1】 第55页 五、版本控制问题 第58页 1、新老代码中同一全局变量不一致 第58页 【案例5.1.1】 第58页 六、可测试性代码问题 第59页 1、调试信息/打印信息的正确性 第59页 【案例6.1.1】 第59页 一、逻辑类代码问题 1、变量/指针在使用前就必须初始化 【案例1.1.1】 C语言中最大的特色就是指针。指针的使用具有很强的技巧性和灵活性,但同时也带来了很大的危险性。在XXX的代码中有如下一端对指针的灵活使用: ... ... _UC *puc_card_config_tab; ... ... Get_Config_Table(

13,870

社区成员

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

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