
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));
} 展开
多谢多谢!!
#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));
} 展开
5个回答
展开全部
程序最最主要的问题在于:你在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;
}
当你返回这个指针(即局部变量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;
}
展开全部
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语言,好不好?
来自编译器的警告,你返回的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语言,好不好?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1 通过指针,找到第一个目标字符数组结尾
2 将源字符数组逐项复制到目标字符数组尾部
3 在最后添加结束符\0
代码:
void my_str_cat(char *a, char *b)
{
while(*a)a++;
a--;
while(*b)*a++=*b++;
*a='\0';
}
本回答被网友采纳

你对这个回答的评价是?
展开全部
学了不少东西! jinglebaby0807 - 助理 二级 太厉害了!
做个朋友吧~我们一起努力!
做个朋友吧~我们一起努力!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
回答的不错啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询