解题思路:
省事的方法有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 人评分
C语言考试练习题_排列 (C语言代码)浏览:1373 |
数组输出 (C语言代码)--此题的题目描述有问题浏览:1844 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:910 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:761 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:943 |
最小公倍数 (C语言代码)浏览:1107 |
printf基础练习2 (C语言代码)浏览:653 |
K-进制数 (C语言描述,蓝桥杯)浏览:955 |
1035 题解浏览:875 |
Hello, world! (C语言代码)浏览:916 |