免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5053 | 回复: 12
打印 上一主题 下一主题

[C] return 指针 结果不对,大家帮忙看看 [复制链接]

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-07 23:15 |只看该作者 |倒序浏览
int main(void){
        char *pwd="iloveyou";
        char *strrev(char *str);
        //strrev(pwd);
        printf("%s\n",strrev(pwd));
}

char *strrev(char *str){
        int len=strlen(str);
        int i,n;
        char returnstr[len];
        for(i=len-1,n=0;str[i]!='\0';i--,n++){
                returnstr[n]=str[i];
        }
        returnstr[n+1]='\0';
        return returnstr;
        //printf("%s\n",returnstr);
}

我要的结果时uoyevoli 但是结果确实乱码,如果我不return直接strrev(pwd);就是对的.

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
2 [报告]
发表于 2012-09-07 23:25 |只看该作者
有人在吗
自己顶起来

论坛徽章:
0
3 [报告]
发表于 2012-09-08 00:10 |只看该作者
本帖最后由 hbmhalley 于 2012-09-08 00:10 编辑

static char returnstr[MAXLEN];

论坛徽章:
0
4 [报告]
发表于 2012-09-08 00:19 |只看该作者
char *strrev(char *str){
        int len=strlen(str);
        int i,n;
        char returnstr[len];
        for(i=len-1,n=0;str[i]!='\0';i--,n++){
                returnstr[n]=str[i];
        }
        returnstr[n+1]='\0';
        return returnstr;
        //printf("%s\n",returnstr);
}

第一,不应该返回一个局部变量
第二,你的循环结束条件错误,会内存越界
第三,returnstr应该申明len+1长度
第四,翻转字符串的算法没必要另开一个内存

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
5 [报告]
发表于 2012-09-08 00:23 |只看该作者
回复 3# hbmhalley


    出现这样的错误

    storage size of 'returnstr' isn't constant.

论坛徽章:
0
6 [报告]
发表于 2012-09-08 00:28 |只看该作者
回复 5# nxlinux


   
static char returnstr[MAXLEN];

    #define MAXLEN xxx

论坛徽章:
2
IT运维版块每日发帖之星
日期:2016-02-10 06:20:01IT运维版块每日发帖之星
日期:2016-02-11 06:20:00
7 [报告]
发表于 2012-09-08 00:30 |只看该作者
回复 4# hijzhang


    你最后说的翻转没有必要再开内存时什么意思,小弟糊涂了

论坛徽章:
0
8 [报告]
发表于 2012-09-08 00:33 |只看该作者
回复 7# nxlinux


    你直接在pwd上交换就行了
0和len-1交换,1和len-2交换。

论坛徽章:
0
9 [报告]
发表于 2012-09-08 00:44 |只看该作者
hijzhang 发表于 2012-09-08 00:33
回复 7# nxlinux


一般都是char *strrev(const char *str)这种格式,返回一个新的字符串,没必要在原来字符串上改。

论坛徽章:
0
10 [报告]
发表于 2012-09-08 00:56 |只看该作者
strrev - Reverse String

Syntax




#include <string.h>
char *strrev(char *string);


Description

strrev reverses the order of the characters in the given string. The ending null character (\0) remains in place.

Returns

strrev returns a pointer to the altered string. There is no error return value.

strrev返回修改后的字符串,而不是新串。

另外,const 是C++才有的东西,而strrev显然应该设计成是一个c函数
在函数内部分配内存返回给调用者也是要尽力避免的事情。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP