字符串反序非常简单,但是怎么传递回主函数费了我一番时间。
一开始我犯了典型的错误,在函数里定义新字符串,这样就需要为字符串动态分配内存,但是书上这部分内容还没讲到,不会写。
然后我在主函数分配一段内存,试图将传回来的字符串指针赋值给这段内存,发现也不行,单步调试的时候,明明看起来已经赋值成功了,打印出来就是不对,不懂为什么,这个我还是不理解。
分割线
时隔几天想通了这个问题,因为定义在函数中的字符串指针也是局部变量,而不是常量,局部变量在函数执行完毕后就会自动释放,因此是传不回去的。
分割线
接下来我就决定,在网上查找一下将函数中的字符串传回主函数的方法,对于我个人来说比较实用的有两种:
第一种,将字符串指针作为函数参数传入,并返回这个指针。这样在主函数开辟好内存后,先将这段空间传入函数,再经过函数处理,最后传回主函数,可以实现功能要求
代码如下:
#include <stdio.h>
#include "string.h"
#define SIZE 30
char * reverse_string(char * str1 ,char * str2);
int main(int argc, const char * argv[]) {
char test1[SIZE];
char test2[SIZE];
puts("input string1:");
gets(test1);
reverse_string(test1 , test2);
pputs("the reverse string:");
puts(test2);
return 0;
}
char * reverse_string(char * str1 ,char * str2)
{
int i=0;
int length = strlen(str1);
for(i=0;i<length;i++){
*(str2+i) = *(str1+length-i-1);
}
*(str2+length) = '\0';
return str2;
}
第二种,使用malloc函数在函数中动态分配内存,并在主函数中释放。
使用malloc函数和free函数,要添加stdlib.h头文件。
#include <stdio.h>
#include "string.h"
#include "stdlib.h"
#define SIZE 30
char * reverse_string(char * str1);
int main(int argc, const char * argv[]) {
char test1[SIZE];
char * test2;
puts("input string1:");
gets(test1);
test2 = reverse_string(test1);
puts("the reverse string:");
puts(test2);
free(test2);
return 0;
}
char * reverse_string(char * str1)
{
char * str2 = (char *)malloc(SIZE);
int i=0;
int length = strlen(str1);
for(i=0;i<length;i++){
*(str2+i) = *(str1+length-i-1);
}
*(str2+length) = '\0';
return str2;
}