如何编写正确的strcmp?

时间:2016-12-12 12:55:57

标签: c

下面是我为_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

2 个答案:

答案 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

  • str1str2应该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;
        }
    }
}