免费注册 查看新帖 |

Chinaunix

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

[C] 请教一个关于字符指针的问题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-28 19:47 |只看该作者 |倒序浏览
看K&R C,遇到一个习题,感觉自己做的比很多参考答案都简单,但是又不太拿得准。所以请大家帮忙看看我的做法会不会有什么问题,谢谢了。

题目是:编写函数strend(s, t)。如果字符串t出现在字符串s的尾部,该函数返回1,否则返回0。

没找参考答案之前,我的写法是:
int strend(char *s, char *t)
{
    s = s + (strlen(s) - strlen(t));
    while (*s++ != *t++)
        return 0;
    return 1;
}
思路是直接把指针s移动到尾部与字符串t长度匹配处,然后向后比较即可得到結果。

配套习题的答案是:
int strend_ref(char *s, char *t)
{
    char *bs = s;
    char *bt = t;

    for (; *s; s++)
        ;   
    for (; *t; t++)
        ;   

    for (; *s == *t; s--, t--)
        if (t == bt || s == bs)
            break;
    if (*s == *t && t == bt && *s != '\0')
        return 1;
    else
        return 0;
}
他是先记住初始位置,然后把两个字符串的指针都移动到末尾再向前比较。

对于上面两种实现,自己用几对字符串都做了测试,結果没什么分别。从思路和实现上讲,我感觉自己的方案都要好一些,但是作者为什么没有这么做呢?还是说我的方案有问题?请有心人帮忙指点,谢谢了。

论坛徽章:
0
2 [报告]
发表于 2012-08-28 20:44 |只看该作者
回复 1# androiddiscuz


    因为K&R写书的时候  还没标准库了,也就没有strlen()这个函数了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
3 [报告]
发表于 2012-08-28 21:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2012-08-28 21:29 |只看该作者
回复 1# androiddiscuz


    你没看懂人家的题意:

A在B未尾,或B在A未尾,人家都返回1 的说,此外,你的那个要改为:

[code]
while(*t && *t++==*s++){}
return *t;
[code]

当然,还是不合题意,但实现了你想实现的功能。

论坛徽章:
0
5 [报告]
发表于 2012-08-28 22:10 |只看该作者
回复 3# pmerofc

这个就是依次比较每个字符,遇到不相等的字符立即返回0
   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2012-08-28 22:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2012-08-28 22:36 |只看该作者
pmerofc 发表于 2012-08-28 22:19
你一定要我直言你写得不对吗


不好意思,我又检查过了,还是没发现你说不对的地方。对于C语言,我确是初学,请您直言,谢谢!我是借鉴K&R C里
  1. while (*s++ = *t++)
  2.     ;
复制代码
这段代码来写的,他的是拷贝字符,我用作比较字符相不相等。

论坛徽章:
0
8 [报告]
发表于 2012-08-28 22:39 |只看该作者
本帖最后由 androiddiscuz 于 2012-08-28 22:42 编辑

回复 4# folklore


    兄弟,你误解了,题目没有你说的那个意思,而且答案的那个代码我也验证过了,不具备你说的那个功能。


    实现你说的功能,倒数第五行的程序要稍微改一下:
  1. if (*s == *t && t == bt && *s != '\0')
复制代码
应该改为
  1. if (*s == *t && (t == bt || s == bs) && *s != '\0')
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2012-08-28 23:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
10 [报告]
发表于 2012-08-28 23:29 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP