0x01、题目信息
题目如下,原题链接在这里
题目描述
不用strcat 函数,自己编写一个字符串链接函数MyStrcat(char dstStr[],charsrcStr[])
输入描述:
两个字符串,字符串由小写字母组成。
输出描述:
链接后的字符串
示例1
输入
hello world
good morning
输出
helloworld
goodmorning
0x02、分析思路
首先看到字符串拼接,第一反应是使用strcat
,但是很遗憾,题目明确禁止strcat,抖一下机灵,使用sprintf
函数试试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str3;
char str1[20],str2[20];
while(scanf("%s",str1) != EOF){
scanf("%s",str2);
getchar();
str3 = (char *) malloc(strlen(str1) + strlen(str2));
sprintf(str3, "%s%s", str1, str2);
printf("%s\n",str3);
}
return 0;
}
没错,通过了
还是回归正常思路吧,分析如下:
- 由题构建一个函数
MyStrcat(char dstStr[],char charsrcStr[])
,将字符串拼接 - 字符串拼接可以使用新建第三个字符串,将输入的两个串分别一个一个字母写入
- 将字符串返回回
main
函数 main
函数需要保证循环间隔空格读取字符串,使用scanf
需要清理换行符,这里可以使用getchar
所以最终代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * MyStrcat();
char * MyStrcat(char dstStr[],char charsrcStr[]){
static char sumstr[100];
int len1 = strlen(dstStr);
int len2 = strlen(charsrcStr);
int i = 0;
for(int j = 0;j < len1;j++){
sumstr[i] = dstStr[j];
i++;
}
for(int j = 0;j < len2;j++){
sumstr[i] = charsrcStr[j];
i++;
}
return sumstr;
}
int main()
{
char *str3;
char str1[20],str2[20];
while(scanf("%s",str1) != EOF){
scanf("%s",str2);
getchar();
str3 = MyStrcat(str1,str2);
printf("%s\n",str3);
}
return 0;
}
0x03、字符串返回
上述代码,我使用了一个局部静态变量来返回字符串给主函数,一般常用方法有四种,总结如下:
-
将字符串指针作为函数参数传入,并返回该指针。
-
使用malloc函数动态分配内存,注意在主调函数中释放。
-
返回一个静态局部变量。
-
使用全局变量。
详细例子与解释如下:
方法一:将字符串指针作为函数参数传入,并返回该指针。
典型的strcpy()
函数应该就是采用的这种方法,第一个参数为指向目的字符串的指针,返回值也为这个指针。
char* strcpy(char* des,const char* source)
{
char* r=des;
assert((des != NULL) && (source != NULL));
while((*r++ = *source++)!='\0');
return des;
}
方法二:使用malloc函数动态分配
一定要注意在主调函数中将其释放,应为malloc
动态分配的内存位于堆区,而堆区的内存是要我们自己来释放的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * retstring();
int main()
{
char * name2;
name2 = retstring();
printf("%s\n",name2);
//记住一定要用free释放,否则会造成内存泄露
free(name2);
return 0;
}
char * retstring()
{
char * name;
name = (char *)malloc(10);
strcpy(name,"张汉青");
return name;
}
方法三:返回一个静态局部变量
一个例子如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * retstring();
int main()
{
char * name2;
name2 = retstring();
printf("%s\n",name2);
return 0;
}
char * retstring()
{
static char name[10];
strcpy(name,"张汉青");
return name;
}
这种方法有一个问题: 由于采用了静态局部变量(位于静态区,程序结束时由系统进行释放),这就导致,如果多次调用这个函数,下一次调用会将上一次调用的结果覆盖掉。
C语言中的库函数,tmpnam()
函数、getenv()
函数等应该都是采用的这种方法,这也就是为什么,使用这样的函数的时候应该立即将返回结果拷贝一份的原因
方法四: 使用全局变量
一个例子如下:
char g_s[100];
char* fun()
{
strcpy(g_s, "abc ");
return g_s;
}