c语言中strcmp函数的暗坑,别踩!

1,470 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

每天一小步,成功一大步。大家好,我是程序猿小白 gw_GW,很高兴能和大家一起学习每天小知识。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要讲strcmp函数的用法以及易错点,避免大家踩坑。

strcmp函数易错点

今天在做一道保持链表有序的练习题,在编译器上答案完全正确,但是在pta上运行时就是过不了,检查了一遍又一遍算法思想,结果是算法确实更加优化了,但是在pta上就是过不了。再仔细看看代码,突然看到strcmp这个函数,经过查阅之后修改了一下代码,最终过了pta的测试。因为对这个函数不太了解,所以踩了坑,所以赶紧和掘友们分享一下,希望大家不要踩坑。

敲黑板

有错误的代码是: strcmp(pos->id,t->id) == -1

经过更改后的正确代码是: strcmp(pos->id,t->id) < 0

函数原型

int strcmp``(``const char *s1,``const char *s2);

我把源码也给大家拿了过来,大家可以参考理解:

int strcmp(const char *str1, const char *str2)
{
    while(*str1 && (*str1==*str2)){
        ++str1;
        ++str2;
    }
    return *str1 - *str2;
}

上面这种源码得到的返回结果就不一定是1和-1,而是两个字符的ASCII码之差

还有一种微软的:

int __cdecl strcmp (const char *src, const char *dst)
{ 
        int ret = 0 ; 
        while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) 
        { 
          ++src; 
          ++dst; 
        } 
        if ( ret < 0 ) 
          ret = -1 ; 
        else if ( ret > 0 ) 
          ret = 1 ; 
        return  ret; 
}

对于上面两种源码的比较大家就可以发现,在不同的编译器上同样的代码可能会的得到不同的结果,因此在使用时,还是返回小雨0比较保险。

函数使用方法

当s1<s2时,返回为负数;

当s1=s2时,返回值= 0;

当s1>s2时,返回正数。

这里要注意的是: 当两个字符串不相等时,C标准并没有规定返回值会是1 或 -1,只规定了正数和负数。 有些会把两个字符的ASCII码之差作为比较结果由函数值返回。

这里也提醒大家,在学习新的函数或方法时一定要注意函数的返回值类型和返回结果的不同值的含义。