免费注册 查看新帖 |

Chinaunix

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

Code correction [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-03 22:00 |只看该作者 |倒序浏览
given that char *str, which is either NULL or valid string with '\0' teminated, the following function is one implementation of reversing of str by O(1) in space and O(n) in time and not use any <string.h> functions. The code has flaws to crash, please correct them by keeping major code.


void reverse(char *str) {
    char *ptr = str;

    while(ptr && *ptr != '\0') {
        ptr++;
    }
    if (ptr)
        ptr--;

    while(str && str < ptr) {
        char c = *str;
        *str = *ptr;
        *ptr = c;

        str++;
        ptr--;
    }
}


Who can help me to correct them? Thanks.

[ 本帖最后由 grizzly 于 2007-10-3 22:01 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-10-03 22:07 |只看该作者
如果字符串是"\0"的话
就可能crash

论坛徽章:
0
3 [报告]
发表于 2007-10-03 22:23 |只看该作者

回复 #2 ypxing 的帖子

Can you explain more about why it is possible? For example, because of "ptr--". Thank you for your reply.

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2007-10-04 20:57 |只看该作者
有可能while(ptr && *ptr != '\0') {有问题

我不清楚“短路”是不是C标准规定的, 如果不是的话这个应该算一个问题

论坛徽章:
0
5 [报告]
发表于 2007-10-04 21:22 |只看该作者
原帖由 koolcoy 于 2007-10-4 20:57 发表
有可能while(ptr && *ptr != '\0') {有问题

我不清楚“短路”是不是C标准规定的, 如果不是的话这个应该算一个问题

C/C++都遵守“短路计算”

论坛徽章:
0
6 [报告]
发表于 2007-10-04 21:54 |只看该作者
原帖由 ypxing 于 2007-10-3 22:07 发表
如果字符串是"\0"的话
就可能crash


ptr-- 么?这个没问题

论坛徽章:
0
7 [报告]
发表于 2007-10-05 09:27 |只看该作者
你改变了指针str,那么反转后str已经发生变化,你不可能得到反转后的结果~~

论坛徽章:
0
8 [报告]
发表于 2007-10-05 09:52 |只看该作者
怎么看这个程序都没有啥问题啊。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
9 [报告]
发表于 2007-10-05 13:11 |只看该作者
原帖由 tyc611 于 2007-10-4 21:22 发表

C/C++都遵守“短路计算”

"遵守"怎将? 是C标准规定所有的C编译器必须实现"短路"吗?

论坛徽章:
0
10 [报告]
发表于 2007-10-05 14:42 |只看该作者
这段代码valgrind也没有报错。

但在C语言中进行比较的指针必须位于同一段分配的区间或者区间后一个字节,上面的程序if (ptr) ptr--;在字符串只有一个\0时会把指针置于区间前一个字节(即为非法指针),后面的while判断结果未定义。改为if (ptr && ptr > str) ptr--;当能消除这一隐患。

逻辑运算符从左至右进行短路估值运算,是标准说明。

不敢确定,还请高人指点。

[ 本帖最后由 福瑞哈哥 于 2007-10-5 14:45 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP