执行strcmp

bla*_*ish 9 c 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;
}
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)


Vla*_*cow 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 );
}
Run Code Online (Sandbox Code Playgroud)