文字列処理

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


C言語で文字列を比較する際、通常はstrcmp関数を使用しますが、これを使わずに比較する方法もあります。

文字列は配列として扱われるため、ループを用いて各文字を一つずつ比較することが可能です。

例えば、whileループを使用して、各文字が等しいかどうかを確認し、異なる文字が見つかった時点でループを終了させる方法があります。

この方法では、文字列の終端を示す'\0'に注意し、両方の文字列が同時に終端に達した場合に等しいと判断します。

手動で文字列を比較する方法

C言語で文字列を比較する際、標準ライブラリのstrcmp関数を使わずに手動で比較する方法があります。

ここでは、ループ、ポインタ、文字コードを利用した3つの方法を紹介します。

ループを使った文字列比較

ループを使って文字列を1文字ずつ比較する方法です。

forループやwhileループを用いて、各文字を順番に比較していきます。

#include <stdio.h>
int compareStrings(const char *str1, const char *str2) {
    int i = 0;
    // 文字列を1文字ずつ比較
    while (str1[i] != '\0' && str2[i] != '\0') {
        if (str1[i] != str2[i]) {
            return str1[i] - str2[i];
        }
        i++;
    }
    // 文字列の長さが異なる場合の処理
    return str1[i] - str2[i];
}
int main() {
    const char *string1 = "こんにちは";
    const char *string2 = "こんばんは";
    int result = compareStrings(string1, string2);
    if (result == 0) {
        printf("文字列は同じです。\n");
    } else {
        printf("文字列は異なります。\n");
    }
    return 0;
}
文字列は異なります。

このコードでは、compareStrings関数が2つの文字列を1文字ずつ比較し、異なる場合はその差を返します。

文字列が同じ場合は0を返します。

ポインタを使った文字列比較

ポインタを使って文字列を比較する方法です。

ポインタを使うことで、文字列の各文字に直接アクセスし、比較を行います。

#include <stdio.h>
int compareStrings(const char *str1, const char *str2) {
    // ポインタを使って文字列を比較
    while (*str1 != '\0' && *str2 != '\0') {
        if (*str1 != *str2) {
            return *str1 - *str2;
        }
        str1++;
        str2++;
    }
    // 文字列の長さが異なる場合の処理
    return *str1 - *str2;
}
int main() {
    const char *string1 = "おはよう";
    const char *string2 = "おはよう";
    int result = compareStrings(string1, string2);
    if (result == 0) {
        printf("文字列は同じです。\n");
    } else {
        printf("文字列は異なります。\n");
    }
    return 0;
}
文字列は同じです。

このコードでは、ポインタを使って文字列を比較し、異なる場合はその差を返します。

ポインタを使うことで、コードがより簡潔になります。

文字コードを利用した比較

文字コードを利用して、文字列を比較する方法です。

各文字のASCII値を比較することで、文字列の順序を判断します。

#include <stdio.h>
int compareStrings(const char *str1, const char *str2) {
    // 文字コードを利用して比較
    while (*str1 != '\0' && *str2 != '\0') {
        if (*str1 != *str2) {
            return *str1 - *str2;
        }
        str1++;
        str2++;
    }
    // 文字列の長さが異なる場合の処理
    return *str1 - *str2;
}
int main() {
    const char *string1 = "さようなら";
    const char *string2 = "さよなら";
    int result = compareStrings(string1, string2);
    if (result == 0) {
        printf("文字列は同じです。\n");
    } else {
        printf("文字列は異なります。\n");
    }
    return 0;
}
文字列は異なります。

このコードでは、文字コードを利用して文字列を比較し、異なる場合はその差を返します。

文字コードを利用することで、文字列の辞書順を判断することができます。

応用例

文字列比較の基本を理解したところで、応用的な比較方法についても見ていきましょう。

ここでは、大文字と小文字を区別しない比較、部分文字列の比較、文字列の辞書順比較について解説します。

大文字と小文字を区別しない比較

大文字と小文字を区別せずに文字列を比較する方法です。

通常の比較では文字コードが異なるため、大文字と小文字は別の文字として扱われますが、これを無視して比較することができます。

#include <stdio.h>
#include <ctype.h>
int compareStringsIgnoreCase(const char *str1, const char *str2) {
    // 大文字と小文字を区別しない比較
    while (*str1 != '\0' && *str2 != '\0') {
        if (tolower(*str1) != tolower(*str2)) {
            return tolower(*str1) - tolower(*str2);
        }
        str1++;
        str2++;
    }
    return tolower(*str1) - tolower(*str2);
}
int main() {
    const char *string1 = "Hello";
    const char *string2 = "hello";
    int result = compareStringsIgnoreCase(string1, string2);
    if (result == 0) {
        printf("文字列は同じです。\n");
    } else {
        printf("文字列は異なります。\n");
    }
    return 0;
}
文字列は同じです。

このコードでは、tolower関数を使って各文字を小文字に変換し、大文字と小文字を区別せずに比較しています。

部分文字列の比較

文字列の一部を比較する方法です。

特定の位置から始まる部分文字列を比較することで、文字列の一部が一致するかどうかを確認できます。

#include <stdio.h>
#include <string.h>
int compareSubstrings(const char *str1, const char *str2, size_t start, size_t length) {
    // 部分文字列を比較
    for (size_t i = 0; i < length; i++) {
        if (str1[start + i] != str2[i]) {
            return str1[start + i] - str2[i];
        }
    }
    return 0;
}
int main() {
    const char *string1 = "こんにちは世界";
    const char *string2 = "世界";
    int result = compareSubstrings(string1, string2, 5, strlen(string2));
    if (result == 0) {
        printf("部分文字列は同じです。\n");
    } else {
        printf("部分文字列は異なります。\n");
    }
    return 0;
}
部分文字列は同じです。

このコードでは、compareSubstrings関数が指定された位置から始まる部分文字列を比較し、一致するかどうかを判断します。

文字列の辞書順比較

文字列を辞書順に比較する方法です。

これは、文字列の順序を決定する際に役立ちます。

#include <stdio.h>
int compareStringsLexicographically(const char *str1, const char *str2) {
    // 辞書順で文字列を比較
    while (*str1 != '\0' && *str2 != '\0') {
        if (*str1 != *str2) {
            return *str1 - *str2;
        }
        str1++;
        str2++;
    }
    return *str1 - *str2;
}
int main() {
    const char *string1 = "apple";
    const char *string2 = "banana";
    int result = compareStringsLexicographically(string1, string2);
    if (result < 0) {
        printf("'%s'は'%s'より前にあります。\n", string1, string2);
    } else if (result > 0) {
        printf("'%s'は'%s'より後にあります。\n", string1, string2);
    } else {
        printf("文字列は同じです。\n");
    }
    return 0;
}
'apple'は'banana'より前にあります。

このコードでは、compareStringsLexicographically関数が文字列を辞書順に比較し、順序を決定します。

辞書順比較は、文字列のソートや検索において重要な役割を果たします。

まとめ

文字列比較はC言語プログラミングにおいて基本的かつ重要な操作です。

手動での文字列比較を通じて、柔軟な実装やパフォーマンスの最適化が可能であることを学びました。

この記事を参考に、実際のプログラムで文字列比較を試してみてください。

関連記事

Back to top button