C - 确定字符/字符串的字母顺序

时间:2017-11-10 21:20:53

标签: c arrays string char

我正在尝试编写一个比较两个字符串(s1和s2)的函数,并按字母顺序(与读取字典的方式相同)判断s1是在s2字符串之前,之后还是等于s2字符串。如果s1在s2之前,它应该返回-1。如果它等于s2,它应该返回0.如果它在s2之后它应该返回1.

我很难让函数工作 - 我似乎只能获得每个字符串中第一个字符的返回值,并且只使用相同的情况。感谢您提供的任何帮助。

到目前为止,这是代码:

#include <stdio.h>
#include <stdlib.h>

int cmpstr(const char *, const char *);

int main()
{
    printf("Test 1: %d\n", cmpstr( "Hello", "World"));
    printf("Test 2: %d\n", cmpstr( "Hello", "Hello"));
    printf("Test 3: %d\n", cmpstr( "World", "Hello"));

    return 0;
}


int cmpstr(const char *s1, const char *s2)
{

    /*compare corresponding string characters until null is reached*/
    while(*s1 != '\0'  && *s2 != '\0' )
    {
        if (*s1 < *s2)
        {
            return -1;
        }
        else if (*s1 > *s2)
        {
            return 1;
        }
        else
        {
            return 0;
            s1++;
            s2++;
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

在else语句中删除'return 0'将起作用。如果字符在相同级别上相等,则需要查看下一个字符,直到相等性中断。

编辑:此外,您需要考虑字符串长度不相等的时间。

int cmpstrMY(const char *s1, const char *s2)
{
    char sc1, sc2;
    /*compare corresponding string characters until null is reached*/
    while (1)
    {
        sc1 = towlower(*s1);
        sc2 = towlower(*s2);

        if (sc1 == '\0'  && sc2 == '\0') {
            break;
        }
        else if (sc1 == '\0' && sc2 != '\0') {
            return -1;
        }
        else if (sc1 != '\0' && sc2 == '\0') {
            return 1;
        }
        else if (sc1 < sc2)
        {
            return -1;
        }
        else if (sc1 > sc2)
        {
            return 1;
        }
        else
        {
            s1++;
            s2++;
        }

    }
    return 0;
}

你的cmpstr必须像上面的代码一样。

答案 1 :(得分:1)

只删除最后一个else部分并将return 0置于循环之外,因为如果如果部分 else-如果部分不成立,则两个字符串仅相等它将从循环中返回,它将返回0。

int cmpstr(const char *s1, const char *s2)
{

        /*compare corresponding string characters until null is reached*/
        while(*s1 != '\0'  && *s2 != '\0' )
        {
                if (*s1 < *s2)
                {
                        return -1;
                }
                else if (*s1 > *s2)
                {
                        return 1;
                }
                s1++;
                s2++;
        }
        return 0;
}

答案 2 :(得分:1)

您的代码有一个非常明显的错误,即return 0 - 语句使s1++;s2++无法访问代码(您的编译器应该警告您)。

但它也存在概念上的错误,因为它忽略了s1长于s2的情况,反之亦然。因此,在您的方法中(一旦更正return 0 - 事物,"Hello""Hello there"将相等。

以不同方式查看以下代码。它跳过相同的字符,直到一个(或两个)字符串结束。然后,根据这种状态,确定结果:

int cmpstr(const char *s1, const char *s2)
{
    while (*s1 && *s2 && *s1 == *s2) { // move forward until either one of the strings ends or the first difference is detected.
        s1++;
        s2++;
    }
    int result = (*s1 - *s2);
    // if both strings are equal, s1 and s2 have reached their ends and result is 0
    // if *s1 > *s2, s1 is lexographically greater than s2 and result is positive
    // if *s1 < *s2, s1 is lexographically lower than s2 and result is negative

    // normalize "positive" and "negative" to 1 and -1, respectively
    if (result < 0)
        result = -1;
    else if (result > 0)
        result = 1;

    return result;
}