strcmp 在比较字符串时如何工作?
How does strcmp work when comparing strings?
我正在实施字典排序,我的教授告诉我们在实施中使用 strcmp
。问题是,strcmp
在比较字符串方面非常混乱。
例如,这里会产生错误:
if (strcmp("What", "am") > 0) {
printf("true\n");
} else {
printf("false\n");
}
"What" 不是应该在字典序上大于 "am" 吗?手册页在解释函数如何确定一个字符串是大于还是小于另一个方面非常简洁。这里有一些问题,但我仍然不能根据这些解释确定这个结果。
任何大写字母都小于任何小写字母。看一张ASCII码表和字典序比较的定义
我猜这是因为 'W' 在 ascii table 中出现在 'a' 之前。所以 'What' 实际上是 'lesser' 而不是 'am'。
如果你切换它们,我猜 'am' 是 'greater' 而不是 'What'.
问题在于 strcmp 进行了二进制比较。这个事实使函数区分大小写! "W"的ASCII码小于"a"的ASCII码。
解决问题的方法是比较大小写相同的文本字符串。
获得这个的简单方法是:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char* stoupper( char* s )
{
char* p = s;
while (*p) {
*p= toupper( *p ); p++
};
return s;
}
int main(void)
{
char a[10];
char b[10];
strcpy(a,"What");
strcpy(b,"am");
if (strcmp(stoupper(a), stoupper(b)) > 0) {
printf("true\n");
} else {
printf("false\n");
}
}
记住函数stoupper的使用明确地修改了字符串中的文本!
我正在实施字典排序,我的教授告诉我们在实施中使用 strcmp
。问题是,strcmp
在比较字符串方面非常混乱。
例如,这里会产生错误:
if (strcmp("What", "am") > 0) {
printf("true\n");
} else {
printf("false\n");
}
"What" 不是应该在字典序上大于 "am" 吗?手册页在解释函数如何确定一个字符串是大于还是小于另一个方面非常简洁。这里有一些问题,但我仍然不能根据这些解释确定这个结果。
任何大写字母都小于任何小写字母。看一张ASCII码表和字典序比较的定义
我猜这是因为 'W' 在 ascii table 中出现在 'a' 之前。所以 'What' 实际上是 'lesser' 而不是 'am'。 如果你切换它们,我猜 'am' 是 'greater' 而不是 'What'.
问题在于 strcmp 进行了二进制比较。这个事实使函数区分大小写! "W"的ASCII码小于"a"的ASCII码。
解决问题的方法是比较大小写相同的文本字符串。
获得这个的简单方法是:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
char* stoupper( char* s )
{
char* p = s;
while (*p) {
*p= toupper( *p ); p++
};
return s;
}
int main(void)
{
char a[10];
char b[10];
strcpy(a,"What");
strcpy(b,"am");
if (strcmp(stoupper(a), stoupper(b)) > 0) {
printf("true\n");
} else {
printf("false\n");
}
}
记住函数stoupper的使用明确地修改了字符串中的文本!