下面是我为 strcmp
编写的代码,我希望它不区分大写和小写字母,但它仍然区分,我该如何解决?
int strcmp(char str1[], char str2[]) {
int i = 0;
for (; str1[i] || str2[i];) {
if (str1[i] > str2[i]) {
int j = (str1[i] - str2[i]);
if (j == 32)
i++;
else {
return +1;
}
} else
if (str1[i] < str2[i]) {
int q = (str1[i] - str2[i]);
if (q == -32) {
i++;
} else {
return -1;
}
} else
if (str1[i] == str2[i]) {
i++;
}
}
return 0;
}
例子: 输入:
Aryan
Semi
Kim
kim
Nap
输出:
Aryan
Kim
Nap
Semi
kim
最佳答案
你的函数有多个问题:
不要名字是
strcmp()
.您不应该重新定义具有不同语义的标准函数。strcmp()
通常是高度优化的,您的版本可能甚至不是您通过strcmp
时使用的版本到你的排序函数。算法不正确:相隔 32 个位置的任何 2 个字符都被视为相等,例如“0”==“P”。
比较是不可传递的:你有
"A" < "_"
和"_" < "a"
还"A" == "a"
,这对于排序来说是非常有问题的。您不应假定 ASCII 并对大小写偏移进行硬编码。使用
toupper()
来自<ctype.h>
并类型转换char
值为(unsigned char)
以避免对负值的未定义行为。i
应该是size_t
.str1
和str2
应该是const
合格。
这是一个改进的版本:
#include <ctype.h>
int strcmp_case(const char *str1, const char *str2) {
for (size_t i = 0;; i++) {
int c1 = toupper((unsigned char)str1[i]);
int c2 = toupper((unsigned char)str2[i]);
if (c1 != c2) {
return (c1 > c2) - (c1 < c2);
}
if (c1 == '\0') {
return 0;
}
}
}
关于c - 如何编写正确的 strcmp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41101439/