Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-确定字符/字符串的字母顺序_C_Arrays_String_Char - Fatal编程技术网

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

C-确定字符/字符串的字母顺序,c,arrays,string,char,C,Arrays,String,Char,我正在尝试编写一个函数来比较两个字符串(s1和s2),并按字母顺序计算s1是在s2字符串之前、之后还是等于s2字符串(与阅读词典的方式相同)。如果s1在s2之前出现,则应返回-1。如果它等于s2,则应返回0。如果在s2之后,则应返回1 我很难让函数工作——我似乎只能得到每个字符串中第一个字符的返回值,而且只能使用相同的大小写。感谢你能给予的任何帮助 以下是迄今为止的代码: #include <stdio.h> #include <stdlib.h> int cmpstr

我正在尝试编写一个函数来比较两个字符串(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;
}
#包括
#包括
int cmpstr(常量字符*,常量字符*);
int main()
{
printf(“测试1:%d\n”,cmpstr(“你好”,“世界”);
printf(“测试2:%d\n”,cmpstr(“你好”,“你好”);
printf(“测试3:%d\n”,cmpstr(“世界”,“你好”);
返回0;
}
int cmpstr(常量字符*s1,常量字符*s2)
{
/*比较相应的字符串,直到达到null*/
而(*s1!='\0'&&&*s2!='\0')
{
如果(*s1<*s2)
{
返回-1;
}
否则,如果(*s1>*s2)
{
返回1;
}
其他的
{
返回0;
s1++;
s2++;
}
}
返回0;
}

删除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;
}
int-cmpstrMY(常量字符*s1,常量字符*s2)
{
字符sc1,sc2;
/*比较相应的字符串,直到达到null*/
而(1)
{
sc1=拖缆器(*s1);
sc2=拖缆器(*s2);
如果(sc1='\0'&&sc2=='\0'){
打破
}
否则如果(sc1='\0'&&sc2!='\0'){
返回-1;
}
否则如果(sc1!='\0'&&sc2=='\0'){
返回1;
}
否则如果(sc1sc2)
{
返回1;
}
其他的
{
s1++;
s2++;
}
}
返回0;
}

您的cmpstr必须与上面的代码类似。

只需删除最后一个else部分,并将返回0放在循环外,因为只有当if partif part不为真时,这两个字符串才相等,当它从循环中出来时,它将返回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;
}
int-cmpstr(常量字符*s1,常量字符*s2)
{
/*比较相应的字符串,直到达到null*/
而(*s1!='\0'&&&*s2!='\0')
{
如果(*s1<*s2)
{
返回-1;
}
否则,如果(*s1>*s2)
{
返回1;
}
s1++;
s2++;
}
返回0;
}

您的代码有一个非常明显的错误,即
返回0
-语句生成
s1++;s2++
转换为不可访问的代码(您的编译器应该警告您这一点)

但它也有一个概念上的错误,因为它忽略了
s1
s2
长的情况,反之亦然。因此,在您的方法中(一旦更正了
返回0
-thing,
“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;
}
int-cmpstr(常量字符*s1,常量字符*s2)
{
而(*s1&&*s2&&*s1==*s2){//向前移动,直到其中一个字符串结束或检测到第一个差异。
s1++;
s2++;
}
int结果=(*s1-*s2);
//如果两个字符串相等,则s1和s2已到达其端点,结果为0
//如果*s1>*s2,s1在词法上大于s2,结果为正
//如果*s1<*s2,则s1在词法上低于s2,结果为负值
//将“正”和“负”分别标准化为1和-1
如果(结果<0)
结果=-1;
否则,如果(结果>0)
结果=1;
返回结果;
}

strcmp不是选项吗?
strcmp
确实是在按字典进行比较。不过,您可能希望将所有内容都转换为小写…从循环内部去掉
返回0
。这没有意义,后面的代码是不可获取的(即死代码)。实际上,您总是在第一次迭代时返回,从不增加
s1
s2
,也从不查看多个字符。您还需要添加逻辑来处理字符串长度不相同的情况。将
s1++;s2++;
移出该代码块。它们永远不会执行。@WeatherVane否,增量在哪里都很好。在它们之前的返回是个问题。Tom是对的,我朝这个方向修改了你的代码。Duygu-首先,谢谢你(和其他人)谢谢你的帮助。我只是想知道用
tolower
代替
towlower
是否可以?我不完全理解宽字符和窄字符之间的区别。你好,一些人!用“tolower”代替“towlower”可以吗,它不应该影响代码的工作方式。我使用它是因为习惯。宽字符增加了数据类型大小以存储更大的编码字符集。在本例中,不需要使用。Duygu-谢谢您,先生。Stephan Lechner-我尝试过修改您的代码以包含大写和小写字符,但我无法使其正常工作,我它只给出1的回报。我已经在我的帖子中编辑了代码。