c语言程序设计习题,求解答!

程序填空,不要改变与输入输出有关的语句。编写一个程序,输入一个字符串后再输入2个字符,输出此字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。用... 程序填空,不要改变与输入输出有关的语句。
编写一个程序,输入一个字符串后再输入2个字符,输出此字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。用返回字符指针的函数实现。
例:(括号内为说明)
输入
program
r
g
输出
rog

我做的答案如下

#include <stdio.h>
char newstr[80];
void main()
{
char str[80],c_begin,c_end;
char *fun(char *p,char c_begin,char c_end);

scanf("%s",str);
getchar();
c_begin=getchar();
getchar();
c_end=getchar();
puts(fun(str,c_begin,c_end));
}
char *fun(char *s,char a,char b)
{
char *p,*q,*m,t[80];
int i;
for(p=s;*p!=a;p++);
for(q=p;*q!=b;q++);
m=p;
for(i=0;i<=q-p;i++)
t[i]=*m++;
t[i]='\0';
return t;
}
可是运行后按题目那样输入,输出的是心形符号而不是rog。为什么?
展开
 我来答
qianlima786
2012-11-30 · TA获得超过177个赞
知道小有建树答主
回答量:145
采纳率:0%
帮助的人:136万
展开全部
我没有运行,但发现了一个错误。你的数组t是在fun函数中定义的,fun函数执行完毕后,数组t的内存就被释放掉了。在main函数中访问一个不存在的内存地址肯定会出问题。你可以把t赋给s,然后返回s.
追问
在return t上面一行加s=t,再把return t改成return s吗?我试过了,结果没变。
追答

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友1c243c8
2012-11-30
知道答主
回答量:27
采纳率:0%
帮助的人:21.8万
展开全部
你那个t[]是局部变量,它在返回时产生一个临时变量,这个临时变量返回后,就会消失,所以你主调函数中的指针是空的,没有地址。
解决办法有将t[]类型改成static char t[80];或者将t[]变成全局变量
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友349d18b
2012-11-30 · TA获得超过444个赞
知道小有建树答主
回答量:571
采纳率:50%
帮助的人:366万
展开全部
算法没仔细看,但你在fun里返回局部变量,这就是问题,改成动态分配.
更多追问追答
追问
还没有学过动态分配,具体怎么改?
追答
char *p,*q,*m,t[80];

改成
char *p,*q,*m,*t = new char[80]; //汗,这是C++的用法
char *p,*q,*m,*t = (char*)malloc(80); //这才是C的
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
庆韶容5E
2012-11-30
知道答主
回答量:72
采纳率:0%
帮助的人:34.7万
展开全部
rog占三个字符的位置,你需要用个二维数组之类的,以前做过过,c++的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式