执行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
的规则中。