我尝试实施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.任何人都可以帮忙吗?请不要指点!
答案 0 :(得分:26)
int strCmp(const char* s1, const char* s2)
{
while(*s1 && (*s1 == *s2))
{
s1++;
s2++;
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
按预期返回&lt; 0,0或&gt;
如果没有指针,你就无法做到。在C中,使用指针索引数组是。
也许您想避免使用*
运算符? : - )
答案 1 :(得分:5)
首先,标准C函数strcmp
将字符串元素与unsigned char
类型进行比较。
其次,参数应该是指向常量字符串的指针,以便为常量字符串提供比较。
该功能可以按以下方式编写
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 );
}
答案 2 :(得分:3)
你似乎想要避免指针算术这是一个遗憾,因为这会使解决方案更短,但你的问题只是你扫描超出字符串的末尾。添加显式中断将起作用。您的程序略有修改:
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;
}
}
}
答案 3 :(得分:2)
这是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
进行比较答案 4 :(得分:0)
您的问题是您没有检测到字符串的结尾,因此如果在检测到任何差异之前两个字符串都结束,则不会返回零。
你可以通过在循环条件中检查这个来简单地解决这个问题:
while( flag==0 && (string1[i] != 0 | string2[i] != 0 ) )
请注意,检查两个字符串是因为如果只有一个字符串在末尾,则字符串不相等,并且循环内的比较应该检测到它。
请注意,字符比较可能不会产生您可能期望的结果。对于尚未定义char
是签名还是未签名的人,您可能应该转换为unsigned char
进行比较。
也许更清晰的解决方案是在您检测到差异时立即返回,而不是flag = -1
直接返回-1
。但这更多是一种意见问题。
答案 5 :(得分:0)
取自here。
#include<stdio.h>
#include<string.h>
//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
一样工作。
答案 6 :(得分:0)
我的实施
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
最后三元操作可选
当您返回strcmp
时,该功能仍会在*s1 - *s2
的规则中。
答案 7 :(得分:0)
另一个带有指针的优雅(但不是最“干净的代码”)实现。
int a_strcmp(char* t, char* s)
{
for( ; *t == *s ; *s++ , *t++)
if(*t == '\0')
return 0;
return *t - *s;
}
不使用指针的版本。
int b_strcmp(char t[], char s[])
{
int i;
for(i = 0; s[i] == t[i]; ++i)
if(t[i] == '\0')
return 0;
return t[i] - s[i];
}