执行strcmp

我试图实现strcmp

 int strCmp(char string1[], char string2[] ) { int i=0,flag=0; while(flag==0) { if (string1[i]>string2[i]) { flag=1; } else if (string1[i]<string2[i]) { flag=-1; } else { i++; } } return flag; } 

但我坚持用户将输入相同字符串的情况,因为该函数使用1和-1,但它不返回0.任何人都可以帮忙吗? 请不要指点!

你似乎想要避免指针算术这是一个遗憾,因为这会使解决方案更短,但你的问题只是你扫描超出字符串的末尾。 添加显式中断将起作用。 您的程序略有修改:

 int strCmp(char string1[], char string2[] ) { int i = 0; int flag = 0; while (flag == 0) { if (string1[i] > string2[i]) { flag = 1; } else if (string1[i] < string2[i]) { flag = -1; } if (string1[i] == '\0') { break; } i++; } return flag; } 

更短的版本:

 int strCmp(char string1[], char string2[] ) { for (int i = 0; ; i++) { if (string1[i] != string2[i]) { return string1[i] < string2[i] ? -1 : 1; } if (string1[i] == '\0') { return 0; } } } 

嗯..方式太复杂了。 去这个:

 int strCmp(const char* s1, const char* s2) { while(*s1 && (*s1 == *s2)) { s1++; s2++; } return *(const unsigned char*)s1 - *(const unsigned char*)s2; } 

它按预期返回<0,0或> 0

没有指针你就做不到。 在C中,索引数组使用指针。

也许你想避免使用*运算符? 🙂

首先,标准C函数strcmp将字符串元素与unsigned char类型进行比较。

其次,参数应该是指向常量字符串的指针,以便为常量字符串提供比较。

该function可以通过以下方式编写

 int strCmp( const char *s1, const char *s2 ) { const unsigned char *p1 = ( const unsigned char * )s1; const unsigned char *p2 = ( const unsigned char * )s2; while ( *p1 && *p1 == *p2 ) ++p1, ++p2; return ( *p1 > *p2 ) - ( *p2 > *p1 ); } 

这是strcmp的10个操作码实现(GCC假设)

 int strcmp_refactored(const char *s1, const char *s2) { while (1) { int res = ((*s1 == 0) || (*s1 != *s2)); if (__builtin_expect((res),0)) { break; } ++s1; ++s2; } return (*s1 - *s2); } 

您可以尝试此实现并与其他人进行比较https://godbolt.org/g/ZbMmYM

从这里开始 。

 #include #include //using arrays , need to move the string using index int strcmp_arry(char *src1, char *src2) { int i=0; while((src1[i]!='\0') || (src2[i]!='\0')) { if(src1[i] > src2[i]) return 1; if(src1[i] < src2[i]) return 1; i++; } return 0; } //using pointers, need to move the position of the pointer int strcmp_ptr(char *src1, char *src2) { int i=0; while((*src1!='\0') || (*src2!='\0')) { if(*src1 > *src2) return 1; if(*src1 < *src2) return 1; src1++; src2++; } return 0; } int main(void) { char amessage[] = "string"; char bmessage[] = "string1"; printf(" value is %d\n",strcmp_arry(amessage,bmessage)); printf(" value is %d\n",strcmp_ptr(amessage,bmessage)); } 

我做了一些改动,使它像strcmp一样工作。

您的问题是您没有检测到字符串的结尾,因此如果两个字符串在检测到任何差异之前结束,则不会返回零。

你可以通过在循环条件中检查这个来简单地解决这个问题:

 while( flag==0 && (string1[i] != 0 | string2[i] != 0 ) ) 

请注意,检查两个字符串是因为如果只有一个字符串在末尾,则字符串不相等,并且循环内的比较应检测到该字符串。

请注意,字符比较可能不会产生您可能期望的结果。 对于一个,它没有定义char是有符号还是无符号,所以你可能应该转换为unsigned char进行比较。

也许更清晰的解决方案是在检测到差异时立即返回,而不是flag = -1 -1直接返回-1 。 但这更多的是意见问题。

我的实施

 int strcmp(const char * s1, const char * s2) { while (*s1 == *s2 && *s1++ | *s2++); int i = *s1 - *s2; return i < 0 ? -1 : i > 0 ? 1 : 0; } 

返回值

 -1 // <0 1 // >0 0 // ==0 

最后一个三元操作是可选的

当你只返回*s1 - *s2时,该函数仍将在strcmp的规则中。