林惜城


私信TA

用户名:reminder

访问量:31323

签 名:

等  级
排  名 91
经  验 9074
参赛次数 0
文章发表 95
年  龄 0
在职情况 学生
学  校 西安电子科技大学
专  业

  自我简介:

哈姆


解题思路:

省事的方法有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分

2 人评分

  评论区

  • «
  • »