解题思路:

省事的方法有str.cat()函数,string.append()函数等等,直接一个函数搞定,为了理解原理我还是用了for循环,即把str2[ ]的字符一个个放到str1[ ]的后面。


注意事项:

本题主要的意义是一个报错:warning :address of local variable returned。

我一开始写的函数是:创一个char数组,把两个char数组放进去,然后返回这个char数组的指针,虽然没有报错,但报了上述警告,而且什么都没输出。

该警告的意思是:不能在函数中返回一个局部变量的地址。专业化解释是:字符串字面量是存储在静态存储区的,函数结束也不会被释放,但是使用char数组的时候,会在栈区新建一个备份,所以在函数结束时就被自动被销毁了(返回的是一个地址,但是在这个函数结束的时候,这个地址指向的那块内存空间放置的内容被释放了,所以通过那个返回的地址已经找不到那块地址对应的内容了),所以肯定是不对的(静态申请内存的变量不能跨函数使用)。

因此没有正常输出也就很好理解了。如果想要返回新数组指针,一个方法是把它定义成字面值,比如char str[] = "Hello World"(本题没法用),另一个方法是把它存入静态存储区(堆区),即用malloc()分配空间,不过要记得释放。


参考代码:

#include <iostream>
#include <cstring>

using namespace std;

const int maxSize = 20; //合并后的数组最大长度

char *mergeStr(char *str1, char *str2);
int main() {
	char str1[maxSize];
	char str2[maxSize];
	cin >> str1 >> str2;
	cout << mergeStr(str1, str2) << endl;
	return 0;
}
char *mergeStr(char *str1, char *str2) {
	//如果新建一个char数组存放合并的字符串,再返回新数组的指针,会警告“不能在函数中返回一个局部变量的地址”
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	//直接使用strcat()函数也行,甚至string.append()应该也行
	for(int i = 0; i < len2; i++) {
		str1[len1 + i] = str2[i];
	}
	return str1;
}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论