下面是我为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位相隔视为相等,例如“0”=“P”。
这种比较是不可传递的:您有"A" < "_""_" < "a"但是"A" == "a",这对于排序来说是非常困难的。
您不应该假设ASCII和硬编码的大小写偏移。使用toupper()from<ctype.h>和castchar值作为(unsigned char)来避免对负值的未定义行为。
i应该是asize_t
str1str2应该是合格的。
下面是一个改进版本:

#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/

10-13 00:11