Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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_Sorting_Compare_Character_Lexicographic - Fatal编程技术网

C语言中的词典排序

C语言中的词典排序,c,sorting,compare,character,lexicographic,C,Sorting,Compare,Character,Lexicographic,我不明白这是怎么回事,为什么?我们如何比较C语言中的字符,我如何理解其中哪个字符比其他字符小或大? 这是书上的 调用函数compareStrings 如果第一个字符串按字典顺序小于第二个字符串,则返回值-1;如果两个字符串相等,则返回值0;如果第一个字符串按字典顺序大于第二个字符串,则返回值1 而不是第二个字符串。那么,函数调用 返回值–1,因为第一个字符串在字典上小于第二个字符串 字符串(这意味着字典中第一个字符串出现在第二个字符串之前), 函数调用 返回值1,因为“zioty”在字典上大于“

我不明白这是怎么回事,为什么?我们如何比较C语言中的字符,我如何理解其中哪个字符比其他字符小或大? 这是书上的

调用函数compareStrings 如果第一个字符串按字典顺序小于第二个字符串,则返回值-1;如果两个字符串相等,则返回值0;如果第一个字符串按字典顺序大于第二个字符串,则返回值1 而不是第二个字符串。那么,函数调用

返回值–1,因为第一个字符串在字典上小于第二个字符串 字符串(这意味着字典中第一个字符串出现在第二个字符串之前), 函数调用

返回值1,因为“zioty”在字典上大于“yucca”

#包括
#包括
结构条目
{
字符字[15];
字符定义[50];
};
布尔相等字符串(字符s1[],字符s2[]
{
bool areEqual=false;
int i=0;
而(s1[i]!='\0'和&s2[i]!='\0'和&s1[i]==s2[i])
i++;
如果(s1[i]='\0'&&s2[i]='\0')
areEqual=真;
其他的
areEqual=false;
回报是平等的;
}
整数查找(结构项字典[],字符搜索[],整数项)
{
int低=0;
int高=条目-1;
int-mid,结果;

虽然(低字典顺序类似于字典顺序,
a
排在
b
前面,但还有一个额外的行为,即大小写重要,大写字母排在小写字母之前,非字母字符也会根据编码进行比较

此比较是逐字符执行的。如果两个字符串中的所有字符相等,则字符串比较相等,返回值为
0
,否则相对顺序由第一个不匹配字符的比较确定。如果
s1[i]
,字符串
s1
位于
s2
之前,返回值为负,否则
s1
位于
s2
之后,返回值为正

然而,请注意,本书的实施是次优的,并且可能不正确:

  • 如果
    s1[i]==s2[i]
    s1[i]!='\0'
    ,则将
    s2[i]
    '\0'
    进行比较是多余的
  • 字符应按
    无符号字符
    进行比较,以使扩展字符位于常规字符之后。
    strcmp
    是这样指定的
以下是一个简化版本:

int compareStrings(const char *s1, const char *s2) {
    size_t i;

    for (i = 0; s1[i] == s2[i]; i++) {
        if (s1[i] == '\0')
            return 0;
    }
    if ((unsigned char)s1[i] < (unsigned char)s2[i])
        return -1;
    else
        return 1;
}

这些是最基本的等式检查、比较和搜索算法。您不了解这些算法或如何在C语言中实现它们吗?我建议您在寻求专家帮助之前做更多的研究。我不明白为什么我们要比较字符串中的最后一个字符。为什么它会按字典顺序调用?@LittleMax not necessarily最后一个字符。想想看,
而(s1[i]==s2[i]&&s1[i]!='\0'&&s2[i]!='\0')i++;
,循环什么时候结束?@Stan当字符不同时。那么如何比较这些字符呢?谢谢anyway@Little马克斯,字符实际上是字节。你不明白什么?
compareStrings ("zioty", "yucca");
#include <stdio.h>
#include <stdbool.h>

struct entry
{
    char word[15];
    char definition[50];
};

bool equalStrings(char s1[], char s2[])
{
    bool areEqual = false;
    int i = 0;

    while(s1[i] != '\0' && s2[i] != '\0' && s1[i] == s2[i])
        i++;

    if(s1[i] == '\0' && s2[i] == '\0')
        areEqual = true;
    else
        areEqual = false;

    return areEqual;
}

int lookup (struct entry dictionary[], char search[],int entries)
{
    int low = 0;
    int high = entries - 1;
    int mid, result;

    while (low <= high)
    {
        mid = (low + high) / 2;
        result = compareStrings (dictionary[mid].word, search);

        if(result == -1)
            low = mid + 1;
        else if(result == 1)
            high = mid - 1;
        else 
            return mid;
    }

    return -1;
}

int compareStrings(char s1[], char s2[])
{
    int i = 0, answer;

    while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
        i++;

    if(s1[i] < s2[i])
        answer = -1;
    else if(s1[i] == s2[i])
        answer = 0;
    else 
        answer = 1;

    return answer;
}

int main()
{
    struct entry dictionary[100] = 
    {
        {"aardvark", "a burrowing African mammal" },
        {"acumen", " a bottomless pit  "},
        {"addle", "to become confused "},
        {"agar", "a jelly made from seaweed" }
        {"affix", "to append; attach"}
    };

    char word[15];
    int entries = 10;
    int entry;

    printf("Enter word: ");
    scanf("%14s", word);
    entry = lookup (dictionary, word, entries);

    if(entry != -1)
        printf("%s\n", dictionary[entry].definition);
    else
        printf("Sorry, the word %s is not in my dictionary.\n", word);

    return 0;

}
int compareStrings(const char *s1, const char *s2) {
    size_t i;

    for (i = 0; s1[i] == s2[i]; i++) {
        if (s1[i] == '\0')
            return 0;
    }
    if ((unsigned char)s1[i] < (unsigned char)s2[i])
        return -1;
    else
        return 1;
}
mid = low + (high - low) / 2;