我试图实现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;
}
Run Code Online (Sandbox Code Playgroud)
但我坚持用户将输入相同字符串的情况,因为该函数使用1和-1,但它不返回0.任何人都可以帮忙吗?请不要指点!
Gia*_*ini 27
嗯..方式太复杂了.去这个:
int strCmp(const char* s1, const char* s2)
{
while(*s1 && (*s1 == *s2))
{
s1++;
s2++;
}
return *(const unsigned char*)s1 - *(const unsigned char*)s2;
}
Run Code Online (Sandbox Code Playgroud)
它按预期返回<0,0或> 0
没有指针你就做不到.在C中,索引数组是使用指针.
也许你想避免使用*运营商?:-)
小智 6
您似乎想避免指针算术,这很遗憾,因为这会使解决方案更短,但您的问题只是扫描超出了字符串的末尾。添加显式中断将会起作用。您的程序稍作修改:
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;
}
Run Code Online (Sandbox Code Playgroud)
较短的版本:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先,标准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 );
}
Run Code Online (Sandbox Code Playgroud)