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