问一个关于字符指针的问题

lirg8405 2009-07-18 09:55:11
bool __fastcall Pub_ExpressMath(char *Result)
{
strcpy(Result,"222");
return true;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
String Str;
Pub_ExpressMath(Str.c_str());
ShowMessage(Str);
}
为什么返回值为空呢?
...全文
67 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lirg8405 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yangangs 的回复:]
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() );
[/Quote]
要出去了,回来再试试
ooip1919 2009-07-18
  • 打赏
  • 举报
回复
对啊
new char[ Edit1->Text.Length() + 1 ];
不就是开辟 Edit1->Text.Length() + 1 个字符的存放空间吗?
lirg8405 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ooip1919 的回复:]
引用 5 楼 yangangs 的回复:
c_str()返回的是一个临时指针,不能对其进行操作


错了吧,我觉得
String Str; //这里他并没有开辟空间给Str
Pub_ExpressMath(Str.c_str()); //你strcpy放到一个没有储存空间的Str,所以为空
ShowMessage(Str);

假若这样定义String Str="abcd";//就有空间可以strcpy,SHOW出"222"

还有最好是用Str.t_str(),我在CB2009中Str.c_str()会报错的



[/Quote]
的确是这样,准备出去,有空了再研究下,谢谢
yangangs 2009-07-18
  • 打赏
  • 举报
回复
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() );
yangangs 2009-07-18
  • 打赏
  • 举报
回复
不是吧,怎么回复了三次,改版后太不习惯了
ooip1919 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yangangs 的回复:]
c_str()返回的是一个临时指针,不能对其进行操作
[/Quote]

错了吧,我觉得
String Str; //这里他并没有开辟空间给Str
Pub_ExpressMath(Str.c_str()); //你strcpy放到一个没有储存空间的Str,所以为空
ShowMessage(Str);

假若这样定义String Str="abcd";//就有空间可以strcpy,SHOW出"222"

还有最好是用Str.t_str(),我在CB2009中Str.c_str()会报错的


yangangs 2009-07-18
  • 打赏
  • 举报
回复
c_str()返回的是一个临时指针,不能对其进行操作
yangangs 2009-07-18
  • 打赏
  • 举报
回复
c_str()返回的是一个临时指针,不能对其进行操作
yangangs 2009-07-18
  • 打赏
  • 举报
回复
c_str()返回的是一个临时指针,不能对其进行操作
lirg8405 2009-07-18
  • 打赏
  • 举报
回复
我的问题是为什么我SHOW出来的是空的呢
周药师 2009-07-18
  • 打赏
  • 举报
回复
lz的方法可以
这样也行的

String __fastcall Pub_ExpressMath(char *Result)
{
strcpy(Result,"222");
return Result;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String Str;
ShowMessage(Pub_ExpressMath(Str.c_str()));
}
mjp1234airen4385 2009-07-18
  • 打赏
  • 举报
回复
String Str = "abcdefg";

13,825

社区成员

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

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