C语言之指针:连接两个字符数组

请问各位高人下面这个程序输出为何有错:多谢多谢!!#include"stdio.h"char*connect(char*pa,char*pb){charc[20],*pc... 请问各位高人下面这个程序输出为何有错:
多谢多谢!!
#include "stdio.h"
char *connect(char *pa,char *pb)
{
char c[20],*pc=c;
int i=0,j=0;
while(*(pa+i)!='\0')
{
*(pc+i)=*(pa+i);
i++;
}

while(*(pb+j)!='\0')
{
*(pc+i)=*(pb+j);
i++;
j++;
}
return(c);
}
main()
{
char a[10],b[10];
scanf("%s",a);
scanf("%s",b);
printf("%s",connect(a,b));

}
展开
 我来答
jinglebaby0807
推荐于2016-02-23 · TA获得超过193个赞
知道小有建树答主
回答量:251
采纳率:0%
帮助的人:179万
展开全部
程序最最主要的问题在于:你在connect函数中,返回了一个局部变量的地址,即局部变量c。
当你返回这个指针(即局部变量c),你是想返回c这个数组的首地址是吧,确实是这样,返回了这个地址值。但是,千万要注意,当你回到主函数时,事实上那个数组早已经不存在了,已经销毁了,也就是说里面的数据已经不是那个connect函数中我们希望的数据了。在主函数中printf("%s",connect(a,b)); 当然不会得到想要的结果了。不知道你明白了没有*_*

我改进了一下,仅供参考
#include "stdio.h"

//增加了一个参数,即s,用于存放连接后的数组元素
char *connect(char *pa, char *pb, char *s)
{
char *pc = s;
int i=0,j=0;

while(*(pa+i)!='\0')
{
*(pc+i)=*(pa+i);
i++;
}

while(*(pb+j)!='\0')
{
*(pc+i)=*(pb+j);
i++;
j++;
}

return s;
}
int main()
{
char a[10],b[10];
char c[20]; //这个数组不放在connect函数中,而是在这里出现,目的是为下面的调用提供接口

scanf("%s",a);
scanf("%s",b);
printf("%s\n", connect(a, b, c));

return 0;
}
你试试吧,可以正确执行*_*
嘿嘿,对于这个程序呢,connect函数是有可以改进之处的,我又做了一点改进,你要是愿意,可以看一下。
#include "stdio.h"
#include "string.h"

//这个connect函数是不是简单了许多呢*_*
char *connect(char *pa, char *pb, char *s)
{
int n = strlen (pa);

strcpy (s, pa);
strcpy (s+n, pb);

return s;
}
int main()
{
char a[10],b[10];
char c[20];

scanf("%s",a);
scanf("%s",b);
printf("%s\n", connect(a, b, c));

return 0;
}
scenbuffalo
2007-10-16 · TA获得超过164个赞
知道小有建树答主
回答量:156
采纳率:0%
帮助的人:163万
展开全部
warning: function returns address of local variable
来自编译器的警告,你返回的c是局部数组,函数返回时,c的内容就不一定是a+b了,由于c存在函数调用的栈上,栈的内容将在函数调用结束后被销毁,所以,你不能在函数调用结束后使用c!
解决办法是你自己提供一个数组来存a+b
#include <stdio.h>
char *connect(char *pa,char *pb, char *c)
{
char *pc=c;
int i=0,j=0;
while(*(pa+i)!='\0')
{
*(pc+i)=*(pa+i);
i++;
}

while(*(pb+j)!='\0')
{
*(pc+i)=*(pb+j);
i++;
j++;
}
return c;
}
int main()
{
char a[10],b[10],c[20];
scanf("%s",a);
scanf("%s",b);
printf("%s",connect(a,b,c));
return 0;
}
//楼上的jinglebaby0807,你好厉害哦,我喜欢你,做我的女朋友吧,我们一起学习C语言,好不好?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风若远去何人留
推荐于2018-04-12 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450101
专业C/C++软件开发

向TA提问 私信TA
展开全部

1 通过指针,找到第一个目标字符数组结尾

2 将源字符数组逐项复制到目标字符数组尾部

3 在最后添加结束符\0

代码:

void my_str_cat(char *a, char *b)
{
    while(*a)a++;
    a--;
    while(*b)*a++=*b++;
    *a='\0';
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dareny
2007-10-15 · TA获得超过505个赞
知道小有建树答主
回答量:287
采纳率:0%
帮助的人:212万
展开全部
学了不少东西! jinglebaby0807 - 助理 二级 太厉害了!
做个朋友吧~我们一起努力!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jiehuangwei
2007-10-15 · TA获得超过162个赞
知道小有建树答主
回答量:395
采纳率:0%
帮助的人:261万
展开全部
回答的不错啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式