执行strcmp

时间:2016-01-19 09:38:27

标签: 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;
}

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

8 个答案:

答案 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];
}
相关问题