我不了解这种工作方式,为什么呢?以及我们如何比较C语言中的字符,我如何理解其中哪个字符比另一个字符少或多? 是从书上来的。
调用函数compareStrings 如果第一个字符串在字典上小于第二个字符串,则返回值–1;如果两个字符串相等,则返回0;如果第一个字符串在字典上大于,则返回1 比第二个字符串。因此,函数调用
compareStrings ("alpha", "altered")
返回值–1,因为第一个字符串在字典上小于第二个 字符串(认为这意味着第一个字符串出现在字典中的第二个字符串之前)。 函数调用
compareStrings ("zioty", "yucca");
之所以返回值1,是因为“辞典”在字典上大于“丝兰”。
#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;
}
如何理解一个大于另一个?谢谢。
答案 0 :(得分:2)
词典顺序类似于字典顺序,a
排在b
之前...……还有大小写相关的其他行为,大写字母排在小写字母之前,非字母字符也根据其编码进行比较。 / p>
此比较是逐字符进行的。如果两个字符串中的所有字符都相等,则字符串比较相等,返回值为0
,否则相对顺序由第一个不匹配字符的比较确定。如果s1[i] < s2[i]
,字符串s1
位于s2
之前,则返回值为负,否则s1
位于s2
之后,则返回值为正。
但是请注意,这本书的实施效果欠佳,可能有误:
s1[i] == s2[i]
和s1[i] != '\0'
,比较s2[i]
与'\0'
是多余的。unsigned char
进行比较,以便扩展字符在常规字符之后。 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;
}
更多说明:
在dictionary
中定义的main
未排序,agar
应该在affix
之后。 lookup
函数依赖于entry
结构的数组进行排序。对于某些输入单词,它可能找不到正确的条目。
lookup
函数使用二进制搜索算法。该方法非常有效,但是实现过程中存在一个经典的错误:mid = (low + high) / 2;
对于大型数组可能会溢出,从而导致未定义的行为。它应该写为:
mid = low + (high - low) / 2;