一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
题目描述
定义一个函数char *strAdd(char *s1, char *s2),其返回的是s1和s2两个字符串合并后的值。(要求不能改变s1和s2)
输入
测试数据的组数 t
第一组字符串1
第一组字符串2
第二组字符串1
第二组字符串2
.......
输出
第一组字符串1 第一组字符串2 第一组字符串1和字符串2的合并
第二组字符串1 第二组字符串2 第二组字符串1和字符串2的合并
.........
输入样例1
2
hello
world
string
concatation
输出样例1
hello world helloworld
string concatation stringconcatation
思路分析
首先我们肯定不能用strcat之类的函数一步到位对吧。
合并两个字符串并不难,不能改变这两个字符串的本来面目也可以,不就是让第三个字符串把这两个存进去而已吗。
难点在于,或者你也没有想到,直到你的程序跑起来你才发现,调用的函数需要返回一个字符串指针,而函数调用时所生成的变量数据之类的会放在栈里面,在函数调用完之后,栈内存会被系统回收,这就是为什么,你返回的字符串是空的。
所以我们需要在函数调用里面申请堆内存,申请内存要释放,但你总不能在函数调用里面释放,那样返回的字符串还是空的,所以要在主函数释放。
AC代码
#include"iostream"
#include"string.h"
using namespace std;
char *strAdd(char *s1, char *s2)
{
int length1=strlen(s1),length2=strlen(s2),i,j;
char *s3=new char[length1+length2+1];
for(i=0,j=0;j<length1+length2;j++)
{
if(i<length1)
s3[j]=s1[i++];
else
s3[j]=s2[i++-length1];
}
s3[j]='\0';
return s3;
}
int main()
{
int t;
char s1[20],s2[20],*s3;
cin>>t;
while(t--)
{
cin>>s1>>s2;
s3=strAdd(s1,s2);
cout<<s1<<' '<<s2<<' '<<s3<<endl;
delete[] s3;
}
}