函数返回值是一个字符串,大家有什么好办法?

eyetiger 2002-05-20 03:17:28
函数返回值是一个字符串,大家有什么好办法?
...全文
1859 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2002-05-20
  • 打赏
  • 举报
回复
方法一:在函数内部申请字符串空间:
char* makestring()
{
char *p = new char[strlen("Hello!") + 1];
strcpy(p , "Hello!");
return p;
}
但这样做风格不太好,因为我们需要在函数外部释放函数内部动态申请的资源。

方法二:把字符串首地址传进函数,在函数内处理,不要觉得这个方法不符合你的要求,因为你的要求本身就太霸道。
void f(char *p)
{
//Process p.
……
}
如果担心越界,可以办字符串的长度也作为参数传进函数中,这样做非常安全,难道不比把字符串从函数返回好?

方法三,自定义一个字符串类,重载拷贝构造函数和赋值运算符,还有什么不能返回的?如果在VC中,MFC里已经有了,CString。
CString f()
{
CString s = "Hello!";
return s;
}
调用函数时,只需一个CString对象接受返回的内容就可以了,字符串空间的分配、释放、内容的拷贝都已经做好了,你只要放心的用就可以了,另外,CString还重载了“LPSTR”类型转换符,所以,你也可以把它当成一个一般的字符指针来用。如:
CString s = "Hello";
char s1[6];
strcpy(s1, s);
当然,这只是个例子,没有什么必要。
kof99th 2002-05-20
  • 打赏
  • 举报
回复
返回值是一个字符串的函数,最好还是把字符串指针当参数传过去吧,避免在函数中动态分配内存容易泄露的问题.
kof99th 2002-05-20
  • 打赏
  • 举报
回复
你的linestr可是常量啊,怎么可以写呢?用数组就可以了,char linestr[]="bbbb";试试看行不行.
eyetiger 2002-05-20
  • 打赏
  • 举报
回复
最后是return,没有0
eyetiger 2002-05-20
  • 打赏
  • 举报
回复
#include <iostream.h>
#include <string.h>

void st(char *p)
{
*p='w';
}

void main()
{
char* linestr="bbbb";
st(linestr);
cout<<linestr<<endl;
return 0;
}

出现内存写错误,为什么,怎么改?
superzjx2000 2002-05-20
  • 打赏
  • 举报
回复
加入字符串中有空格怎么办 我认为应该这样
创建一个
typedef struct {char a[...] //存字符串
int n//字符串长度
}str
在函数中new str;
返回 str
由于str在堆中申请 及时退出函数 str也不会消失
Borlandor 2002-05-20
  • 打赏
  • 举报
回复
char * func()
{
char * p = (char *)malloc(....);

......
return p;
}
......

{
char* s;
s = func();
...

free(s);//must free it!!!!!!

}
Januarius_ 2002-05-20
  • 打赏
  • 举报
回复
直接返回一个string对象吧,我是了一下,好像没什么问题
#include <iostream>
#include <string>

using namespace std;

string f(const string &a) {
return a;
}
int main() {
string str("hello");
string tr;
tr = f(str);
cout<<tr<<endl;
return 0;
}
fang_jb 2002-05-20
  • 打赏
  • 举报
回复
那个string1属于隐含型的错误,运行时的结果不确定,
会出错也可能不会,由于返回的是local变量的地址,行为未定义。

看看linux实现的源码,我手头没有,它的实现好象不是static,
而且工作良好:)
richard_hu 2002-05-20
  • 打赏
  • 举报
回复
两种:第一、返回地址(指针);第二、用指针做参数
zw741027 2002-05-20
  • 打赏
  • 举报
回复
我一般喜欢利用参数传地址的方式的
void func(char * para)
{
}
fangrk 2002-05-20
  • 打赏
  • 举报
回复
把保存结果的地址作为参数列表放到函数中去,比如
char * getDigital(const char*source,char*dest)
{ char*r=dest;
while(*source){
if(*source>='0'&&*source<='9')
*(dest++)=*source;
++source;
}
*dest='\0';
return r;
}
fei1703 2002-05-20
  • 打赏
  • 举报
回复
char *string1="i love you!"为字符窜常量,应该是全局变量;
我觉得在里面分配方便
fang_jb 2002-05-20
  • 打赏
  • 举报
回复
有一些时候可以这样做
char *func()
{
static char sz[10];
...
return sz;
}

{
char tt[10];
strcpy(tt,func());
//tt = func(); 如果你在调用下一次func之后再使用tt,static变量sz值可能改变了
}
eyetiger 2002-05-20
  • 打赏
  • 举报
回复
wangli50(wl):
函数char *zhifu()返回后,系统不收回string1的空间吗?

这个小程序运行是正确的,可我还是不明白

eyetiger 2002-05-20
  • 打赏
  • 举报
回复
wangli50(wl):
函数char *zhifu()返回后char *string1,系统不收回string1的空间吗?

sbg 2002-05-20
  • 打赏
  • 举报
回复
可以返回一个字符指针,或函数参数中传入需要返回的字符指针
返回一个char *类型的值,指向字符串的首地址!

eyetiger 2002-05-20
  • 打赏
  • 举报
回复
如果我调用xuying的函数char* func()

如char *a=func();

之后要delete a ,是不是?
wangli50 2002-05-20
  • 打赏
  • 举报
回复
通过返回一个string的首地址就可以用了。
#include <iostream.h>
char *zhifu()
{
char *string1="i love you!";
return string1;
}
void main()
{
char *string2=zhifu();
cout<<string2;
}
huangwu007 2002-05-20
  • 打赏
  • 举报
回复
我觉得在函数内动态分配不是很好的办法,容易造成内存泄漏
还是在函数外分配好空间,作为参数传入比较好

当然是个人意见
加载更多回复(4)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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