如何使strcmp发挥作用?

如何使strcmp发挥作用?,c,string,function,strcmp,C,String,Function,Strcmp,我想制作自己的strcmp函数,就像C中的函数一样 int my_cmp(const char* str1, const char* str2) { int index; for (index = 0; str1[index] != '\0' && str2[index] != '\0'; index++) if (str1[index] != str2[index]) return (str1

我想制作自己的
strcmp
函数,就像C中的函数一样

int my_cmp(const char* str1, const char* str2)  
{
    int index;
    for (index = 0; str1[index] != '\0' && str2[index] != '\0'; index++)
        if (str1[index] != str2[index])             
            return (str1[index] - str2[index]);             
    return 0;
}
我说得对吗? 我知道并非所有的弦都有相同的长度。
我不确定for语句的条件。

以下代码片段向您展示了如何实现“strcmp”函数:

int myStrCmp (const char *s1, const char *s2) {
    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    while (*p1 != '\0') {
        if (*p2 == '\0') return  1;
        if (*p2 > *p1)   return -1;
        if (*p1 > *p2)   return  1;

        p1++;
        p2++;
    }

    if (*p2 != '\0') return -1;

    return 0;
}

以下代码段向您展示了如何实现“strcmp”函数:

int myStrCmp (const char *s1, const char *s2) {
    const unsigned char *p1 = (const unsigned char *)s1;
    const unsigned char *p2 = (const unsigned char *)s2;

    while (*p1 != '\0') {
        if (*p2 == '\0') return  1;
        if (*p2 > *p1)   return -1;
        if (*p1 > *p2)   return  1;

        p1++;
        p2++;
    }

    if (*p2 != '\0') return -1;

    return 0;
}
这是其中一个例子

这是其中一个例子

我说得对吗?我知道并非所有的弦都有相同的长度。我不确定for声明的条件

你几乎是对的。您的
if
语句

if (str1[index] != str2[index])
    return (str1[index] - str2[index]);
基本上是正确的(虽然字符应该作为
无符号字符
s减去),但是
for
循环本身

for (index = 0; str1[index] != '\0' && str2[index] != '\0'; index++)
这是错误的。具体而言,条件:

str1[index] != '\0' && str2[index] != '\0'
这是错误的,因为它会检查以确保给定索引中的两个字符都不是
'\0'
,而不是任何一个字符。这可以通过将
&
替换为
|
来解决

下面是一个经验丰富的C程序员如何编写strcmp函数(我写了这个:p(EDIT:@chux建议改进)):

我说得对吗?我知道并非所有的弦都有相同的长度。我不确定for声明的条件

你几乎是对的。您的
if
语句

if (str1[index] != str2[index])
    return (str1[index] - str2[index]);
基本上是正确的(虽然字符应该作为
无符号字符
s减去),但是
for
循环本身

for (index = 0; str1[index] != '\0' && str2[index] != '\0'; index++)
这是错误的。具体而言,条件:

str1[index] != '\0' && str2[index] != '\0'
这是错误的,因为它会检查以确保给定索引中的两个字符都不是
'\0'
,而不是任何一个字符。这可以通过将
&
替换为
|
来解决

下面是一个经验丰富的C程序员如何编写strcmp函数(我写了这个:p(EDIT:@chux建议改进)):



如果字符串的长度不同,但排序器的内容与长字符串的内容相同,则函数不正确。您需要执行无符号减法。如果字符串的长度不相等,那么它们就不相等。如果您将此作为一个学习练习,那么这很好。但是,请注意,STRCMP可以被大量使用,因此标准库实现往往高度优化——用于每次迭代测试多个字符的内联和SIMD操作。@ ItNeNaAsieSe:该函数也存在于C++中,并且具有相同的语义。为什么要更改标签?@ MikEMB Trtrue,但是通常的C++方式是实例化两个<代码> STD::String 对象,并使用各种<代码> <代码>,…运算符来比较字符串
strcmp
与C的用法更相关。如果字符串长度不同,但排序器的内容与长字符串的内容相同,则函数不正确。您需要执行无符号减法。如果字符串的长度不相等,那么它们就不相等。如果您将此作为一个学习练习,那么这很好。但是,请注意,STRCMP可以被大量使用,因此标准库实现往往高度优化——用于每次迭代测试多个字符的内联和SIMD操作。@ ItNeNaAsieSe:该函数也存在于C++中,并且具有相同的语义。为什么要更改标签?@ MikEMB Trtrue,但是通常的C++方式是实例化两个<代码> STD::String 对象,并使用各种<代码> <代码>,…运算符来比较字符串
strcmp
与C的用法更相关。“固定”版本还比较字符而不是无符号字符。为什么要将字符转换为
unsigned char*
而不是“char*”?@AugustKarlstrom,否则当字符>=128时,你会得到错误的答案。@MikeMB谢谢,很好的提示。我最真诚的道歉-我忘记返回“-1,0,1”实际上不是strmpt规范的一部分“固定”版本也比较字符而不是无符号字符。为什么要转换为
无符号字符*
而不是'char*'?@AugustKarlstrom,因为否则当字符>=128时,你会得到错误的答案。@MikeMB谢谢,很好的提示。我最真诚的道歉-我忘了返回“-1,0,1”实际上不是strcmp简化规范的一部分:
*s1&&*s2&(*s1==*s2)
-->
*s1&&(*s1==*s2)
-然后优化编译器可能会为您这样做<代码>(无符号字符)(*s1)-(无符号字符)(*s2)在其
无符号字符
int
具有相同位宽的罕见计算机上出现问题。简化:
*s1&*s2&(*s1=*s2)
->
*s1&(*s1=*s2)
-然后优化编译器可能会为您这样做
(无符号字符)(*s1)-(无符号字符)(*s2)
在其
无符号字符
int
具有相同位宽的罕见计算机上出现问题。