如何使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
具有相同位宽的罕见计算机上出现问题。