免费注册 查看新帖 |

Chinaunix

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

[C] strcmp诡异问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-15 13:57 |只看该作者 |倒序浏览
本帖最后由 z32556601 于 2013-03-15 14:01 编辑

先上代码
#include <stdio.h>
#include <string.h>
int strcmp_fb(const char *cs, const char *ct);//把源码里的代码完全拷贝过来.
void main(){
    char a[3] = {'k', 'o', 'b'};//我故意不以'\0'结尾.
    //int b = strcmp("kob", a);
    //printf("%d\n", b);
    int x = strcmp_fb("kob", a);
    printf("%d\n", x);
}

int strcmp_fb(const char *cs, const char *ct){//实现和源码一模一样
    unsigned char c1, c2;

    while (1) {
        c1 = *cs++;
        c2 = *ct++;
        if (c1 != c2)
            return c1 < c2 ? -1 : 1;
        if (!c1)
            break;
    }
    return 0;
}

我把源码里的strcmp代码一模一样的拷到strcmp_fb中.然后分别用同样的参数调用..
结果源码的结果是0.而复制的结果是-1.为什么...

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
2 [报告]
发表于 2013-03-15 14:00 |只看该作者
a没有保证0结尾

论坛徽章:
0
3 [报告]
发表于 2013-03-15 14:01 |只看该作者
我故意不让'\0'结尾的.
但为什么我调用库函数就可以返回0,调用自己copy的就是-1呢
回复 2# hellioncu


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2013-03-15 14:06 |只看该作者
z32556601 发表于 2013-03-15 14:01
我故意不让'\0'结尾的.
但为什么我调用库函数就可以返回0,调用自己copy的就是-1呢
回复 2# hellioncu
...


很可能是运气而已,也许换个环境都返回0,或者-1了,或者-1和0了。

论坛徽章:
0
5 [报告]
发表于 2013-03-15 14:08 |只看该作者
都越界了 数据充满不确定性,就不要深究了。

论坛徽章:
0
6 [报告]
发表于 2013-03-15 14:38 |只看该作者
我不知道你调用strcmp()时,结果为什么为0.我的想法是它应该是个负数,一个随机负数,因为字符串"kob"是以'\0'结尾,它的ACLL值是0,是最小的一个。当然还有EOF,它是-1。
而你自己定义的函数strcmp_fb(),调用它的结果为-1,原因就是字符串"kob"的结束符'\0'会比字符串数组中a【4】要小,所以它会返回-1。

这是我的看法。希望对你有所帮助。

论坛徽章:
0
7 [报告]
发表于 2013-03-15 14:54 |只看该作者
本帖最后由 FaintKnowledge 于 2013-03-15 15:05 编辑

回复 4# hellioncu


我了个去了...你个悲崔的,平时运气太差了吧

哈哈

目测过去,应该是数组空间分配不足引起的,这样的数据要为a[4]才对...

===========================================================================
-------------------------------------
呵,应该是指针越界访问才对...

==========================================================================
==========================================================================
艹,完全错误....
都不是...

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2013-03-15 14:57 |只看该作者
FaintKnowledge 发表于 2013-03-15 14:54
回复 4# hellioncu


这个[3]是LZ故意的,后面应该会对齐,至少补1字节,只是这1字节的值就不确定了。
运气好坏都是LZ的,不是我的

论坛徽章:
0
9 [报告]
发表于 2013-03-15 15:05 |只看该作者
本帖最后由 FaintKnowledge 于 2013-03-15 15:39 编辑

测试的结论还是数组空间不足和内存的越界访问(有点儿夸张)引起的.
可以在
  1.           while (1) {
  2.           c1 = *cs++;
  3.           c2 = *ct++;
  4.             [color=Red]printf("c1=%c,c2=%c\n",c1,c2);[/color]
  5.           if (c1 != c2)
  6.           {
  7.            [color=Red] printf("======================\n");
  8.             printf("c1=%d,c2=%d\n",(int)c1,(int)c2);
  9.             printf("======================\n");
复制代码


然后通过修改a数组的大小来测试.
kob字符串的sizof为:kob\0 为4
a为长度为:
3 :  没有\0的位置,也就是没有结束,后面的位置也没有初始化,为内存中的垃圾值,前三个值是相等的,到这个位置自然就会返回-1
4 : 正好等于“kob”
>4 : 内存在分配的时候会初始化>=4的位置。为‘0’或者NULL,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP