c primer plus第11章课后题第8题:字符串反序。由此引申到c语言中函数如何返回一个字符串。

文章讨论了在C语言中如何将字符串反序操作的结果从函数传递回主函数的问题。作者首先遇到在函数内部定义字符串导致的内存问题,然后了解到局部变量在函数结束后会被释放。文章提出了两种解决方案:一是通过将字符串指针作为参数传递,二是使用malloc在函数内动态分配内存,然后在主函数中释放。每种方法都提供了相应的代码示例。
摘要由CSDN通过智能技术生成

字符串反序非常简单,但是怎么传递回主函数费了我一番时间。
一开始我犯了典型的错误,在函数里定义新字符串,这样就需要为字符串动态分配内存,但是书上这部分内容还没讲到,不会写。
然后我在主函数分配一段内存,试图将传回来的字符串指针赋值给这段内存,发现也不行,单步调试的时候,明明看起来已经赋值成功了,打印出来就是不对,不懂为什么,这个我还是不理解。
分割线
时隔几天想通了这个问题,因为定义在函数中的字符串指针也是局部变量,而不是常量,局部变量在函数执行完毕后就会自动释放,因此是传不回去的。
分割线
接下来我就决定,在网上查找一下将函数中的字符串传回主函数的方法,对于我个人来说比较实用的有两种:
第一种,将字符串指针作为函数参数传入,并返回这个指针。这样在主函数开辟好内存后,先将这段空间传入函数,再经过函数处理,最后传回主函数,可以实现功能要求
代码如下:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值