我试图strcasecmp
在C中重新实现该功能,并且发现比较过程中似乎存在不一致之处。
从 man strcmp
strcmp()函数比较两个字符串s1和s2。不考虑语言环境(有关语言环境的比较,请参阅strcoll(3))。如果分别找到s1小于,匹配或大于s2,则它返回小于,等于或大于零的整数。
从 man strcasecmp
strcasecmp()函数对字符串s1和s2进行逐字节比较,而忽略字符的大小写。如果分别找到s1小于,匹配或大于s2,则它返回小于,等于或大于零的整数。
int strcmp(const char *s1, const char *s2);
int strcasecmp(const char *s1, const char *s2);
鉴于此信息,我不理解以下代码的结果:
#include <stdio.h>
#include <string.h>
int main()
{
// ASCII values
// 'A' = 65
// '_' = 95
// 'a' = 97
printf("%i\n", strcmp("A", "_"));
printf("%i\n", strcmp("a", "_"));
printf("%i\n", strcasecmp("A", "_"));
printf("%i\n", strcasecmp("a", "_"));
return 0;
}
输出:
-1 # "A" is less than "_"
1 # "a" is more than "_"
2 # "A" is more than "_" with strcasecmp ???
2 # "a" is more than "_" with strcasecmp
看起来,如果in中的当前字符s1
是字母,则无论in中当前的字符是否是字母,它总是会转换为小写s2
字母。
有人可以解释这种行为吗?第一和第三行不应该相同吗?
先感谢您!
PS:
我gcc 9.2.0
在Manjaro上使用。
另外,当我用-fno-builtin
标志编译时,我得到的是:
-30
2
2
2
我猜这是因为程序没有使用gcc的优化功能,但是问题仍然存在。
strcasecmp
您所指的描述似乎不正确。建议的答案中有更多详细信息。
A < _ && a > _ && A == a
这样的函数会引起很多问题。
unsigned char
。C17 / 18“字符串处理<string.h>”->“对于本节中的所有功能,每个字符应被解释为具有unsigned char
“” 类型。一旦char
值超出ASCII范围0-127,这将有所不同。
printf("%i\n", strcasecmp("a", "_"));
这应该大概有相同的结果,printf("%i\n", strcasecmp("A", "_"));
但是这意味着,一个两个不区分大小写的通话会与它的区分大小写对方不同意。