下面是我为_default
编写的代码,我希望它不区分大写和小写字母,但它仍然可以,我该如何解决?
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
答案 0 :(得分:1)
例如:
{{1}}
答案 1 :(得分:1)
您的功能存在多个问题:
请勿命名为strcmp()
。您不应该使用不同的语义重新定义标准函数。 strcmp()
通常经过高度优化,您的版本可能不是您将strcmp
传递给排序函数时使用的版本。
算法不正确:相隔32个位置的任意2个字符被认为是相等的,例如&#34; 0&#34; ==&#34; P&#34;。
比较是不可传递的:您有"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;
}
}
}