【C言語】strcmpを使わずに文字列を比較する方法を解説

この記事では、C言語でstrcmp関数を使わずに文字列を比較する方法を解説します。

目次から探す

文字列比較の基本

文字列を比較する方法にはいくつかのアルゴリズムがあり、文字列の長さを比較する方法、文字列の各文字を比較する方法、文字列のハッシュ値を比較する方法などがあります。

それぞれの方法には特徴や利点がありますので、適切な方法を選ぶことが重要です。

文字列の比較における注意点

文字列を比較する際には、いくつかの注意点があります。

例えば、文字列の終端を示すヌル文字(‘\0’)の有無や、大文字と小文字の区別の有無などがあります。

これらの注意点についても解説します。

文字列比較のアルゴリズム

以下では、C言語でstrcmp関数を使わずに文字列を比較する方法を解説します。

文字列の長さを比較する方法

文字列の長さを比較する方法は、文字列の長さを取得して比較する方法です。

具体的な手順としては、まずはじめの文字から順に比較し、異なる文字が見つかった時点で比較を終了します。

もしも文字列の長さが異なる場合は、長さの差を返します。

int compareStringsByLength(const char* str1, const char* str2) {
    int len1 = 0;
    int len2 = 0;
    while (str1[len1] != '\0') {
        len1++;
    }
    while (str2[len2] != '\0') {
        len2++;
    }
    if (len1 < len2) {
        return -1;
    } else if (len1 > len2) {
        return 1;
    } else {
        return 0;
    }
}

文字列の各文字を比較する方法

文字列の各文字を比較する方法は、文字列の各文字を順に比較する方法です。

具体的な手順としては、まずはじめの文字から順に比較し、異なる文字が見つかった時点で比較を終了します。

もしもすべての文字が一致している場合は、0を返します。

int compareStringsByCharacter(const char* str1, const char* str2) {
    int i = 0;
    while (str1[i] != '\0' && str2[i] != '\0') {
        if (str1[i] < str2[i]) {
            return -1;
        } else if (str1[i] > str2[i]) {
            return 1;
        }
        i++;
    }
    if (str1[i] == '\0' && str2[i] == '\0') {
        return 0;
    } else if (str1[i] == '\0') {
        return -1;
    } else {
        return 1;
    }
}

文字列のハッシュ値を比較する方法

文字列のハッシュ値を比較する方法は、文字列をハッシュ関数によってハッシュ値に変換し、そのハッシュ値を比較する方法です。

ハッシュ値が一致していれば、文字列も一致している可能性が高いです。

ただし、ハッシュ値が一致していても文字列が異なる場合があるため、ハッシュ関数を自作する際は重複が発生しづらい複雑な関数を設計することが必要です。

unsigned long hashString(const char* str) {
    unsigned long hash = 5381;
    int c;
    while ((c = *str++)) {
        hash = ((hash << 5) + hash) + c;
    }
    return hash;
}
int compareStringsByHash(const char* str1, const char* str2) {
    unsigned long hash1 = hashString(str1);
    unsigned long hash2 = hashString(str2);
    if (hash1 < hash2) {
        return -1;
    } else if (hash1 > hash2) {
        return 1;
    } else {
        return 0;
    }
}

以上が、C言語でstrcmp関数を使わずに文字列を比較する方法です。

目次から探す