文字列処理

[C言語] strcmp関数の使い方 – 文字列を比較する

strcmp関数は、C言語で2つの文字列を比較するために使用されます。

strcmp(文字列1,文字列2)の形式で呼び出し、文字列1と文字列2を辞書順で比較します。

戻り値は、文字列1が文字列2より小さい場合は負の値、等しい場合は0、大きい場合は正の値です。

比較は文字列の各文字のASCII値に基づいて行われ、最初に異なる文字が見つかった時点で結果が決まります。

strcmp関数とは

strcmp関数は、C言語において文字列を比較するための標準ライブラリ関数です。

この関数は、2つの文字列を引数として受け取り、それらの文字列が同じであるか、どちらが辞書順で先に来るかを判断します。

比較はASCIIコードに基づいて行われ、最初に異なる文字が見つかった時点で比較結果が決まります。

戻り値は、文字列が等しい場合は0、最初の文字列が辞書順で先の場合は負の値、後の場合は正の値となります。

このため、strcmp関数は文字列のソートや検索、ユーザー入力の検証など、さまざまな場面で利用されます。

正確な比較を行うためには、文字列の終端を示すヌル文字(\0)にも注意が必要です。

strcmp関数の使い方

基本的な使用例

strcmp関数の基本的な使い方を以下のサンプルコードで示します。

この例では、2つの文字列を比較し、その結果を出力します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "こんにちは"; // 1つ目の文字列
    const char *str2 = "こんにちは"; // 2つ目の文字列
    int result = strcmp(str1, str2); // 文字列を比較
    if (result == 0) {
        printf("文字列は同じです。\n"); // 同じ場合の出力
    } else {
        printf("文字列は異なります。\n"); // 異なる場合の出力
    }
    return 0;
}
文字列は同じです。

戻り値を使った条件分岐

strcmp関数の戻り値を利用して、条件分岐を行うことができます。

以下のサンプルコードでは、2つの文字列を比較し、どちらが辞書順で先かを判定します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "apple"; // 1つ目の文字列
    const char *str2 = "banana"; // 2つ目の文字列
    int result = strcmp(str1, str2); // 文字列を比較
    if (result < 0) {
        printf("'%s' は '%s' よりも前にあります。\n", str1, str2); // str1が先の場合
    } else if (result > 0) {
        printf("'%s' は '%s' よりも後にあります。\n", str1, str2); // str1が後の場合
    } else {
        printf("文字列は同じです。\n"); // 同じ場合
    }
    return 0;
}
'apple' は 'banana' よりも前にあります。

大文字と小文字の違いに注意

strcmp関数は大文字と小文字を区別して比較を行います。

例えば、”Apple”と”apple”は異なる文字列として扱われます。

以下のサンプルコードでその挙動を確認できます。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "Apple"; // 大文字の文字列
    const char *str2 = "apple"; // 小文字の文字列
    int result = strcmp(str1, str2); // 文字列を比較
    if (result < 0) {
        printf("'%s' は '%s' よりも前にあります。\n", str1, str2); // str1が先の場合
    } else if (result > 0) {
        printf("'%s' は '%s' よりも後にあります。\n", str1, str2); // str1が後の場合
    } else {
        printf("文字列は同じです。\n"); // 同じ場合
    }
    return 0;
}
'Apple' は 'apple' よりも前にあります。

NULLポインタを渡した場合の挙動

strcmp関数にNULLポインタを渡すと、未定義の動作が発生します。

これはプログラムがクラッシュする原因となるため、NULLポインタを渡さないように注意が必要です。

以下のサンプルコードでは、NULLポインタを渡した場合の例を示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = NULL; // NULLポインタ
    const char *str2 = "テスト"; // 2つ目の文字列
    // strcmp関数を呼び出すと未定義の動作が発生する
    int result = strcmp(str1, str2); // これは危険な操作です
    return 0;
}

このコードを実行すると、プログラムがクラッシュする可能性があります。

したがって、strcmpを使用する際は、引数がNULLでないことを確認することが重要です。

strcmp関数の実際の動作

文字列の比較方法

strcmp関数は、2つの文字列を1文字ずつ比較していくことで、文字列の等価性や辞書順を判断します。

比較は、最初の文字から始まり、各文字が等しい限り次の文字に進みます。

最初に異なる文字が見つかった時点で、その文字のASCIIコードを基に比較結果が決まります。

もし、全ての文字が等しい場合は、文字列の終端に達するまで比較が続きます。

ASCIIコードによる比較

strcmp関数は、文字列の各文字をASCIIコードに基づいて比較します。

ASCIIコードは、各文字に対して数値を割り当てたもので、例えば、’A’は65、’B’は66、’a’は97、’b’は98というように、大小文字で異なる値を持ちます。

このため、strcmp関数は大文字と小文字を区別し、例えば、’A’と’a’を比較すると、’A’の方が小さいため、負の値が返されます。

最初に異なる文字で比較が決まる仕組み

strcmp関数は、文字列を比較する際に、最初に異なる文字が見つかった時点で比較結果を決定します。

以下のサンプルコードでは、2つの文字列を比較し、最初に異なる文字がどのように影響するかを示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "apple"; // 1つ目の文字列
    const char *str2 = "apricot"; // 2つ目の文字列
    int result = strcmp(str1, str2); // 文字列を比較
    if (result < 0) {
        printf("'%s' は '%s' よりも前にあります。\n", str1, str2); // str1が先の場合
    } else if (result > 0) {
        printf("'%s' は '%s' よりも後にあります。\n", str1, str2); // str1が後の場合
    } else {
        printf("文字列は同じです。\n"); // 同じ場合
    }
    return 0;
}
'apple' は 'apricot' よりも前にあります。

この例では、最初の異なる文字である’l’と’r’のASCIIコードを比較し、’l’が’r’よりも小さいため、strcmp関数は負の値を返します。

終端文字(

終端文字(\0)の扱い

)の扱い

C言語では、文字列はヌル終端(\0)で終了します。

strcmp関数は、文字列の比較を行う際に、この終端文字を重要な要素として扱います。

比較が全ての文字で等しい場合、最終的にヌル終端に達することで、2つの文字列が同じであると判断されます。

以下のサンプルコードでは、終端文字の扱いを示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "hello"; // 1つ目の文字列
    const char *str2 = "hello"; // 2つ目の文字列
    int result = strcmp(str1, str2); // 文字列を比較
    if (result == 0) {
        printf("文字列は同じです。\n"); // 同じ場合
    } else {
        printf("文字列は異なります。\n"); // 異なる場合
    }
    return 0;
}
文字列は同じです。

この例では、両方の文字列が同じであり、ヌル終端に達するまで全ての文字が等しいため、strcmp関数は0を返します。

ヌル終端が正しく扱われることで、文字列の比較が正確に行われることが保証されます。

応用例

複数の文字列をソートする

strcmp関数は、文字列のソートに非常に便利です。

C言語の標準ライブラリには、qsort関数があり、これを使って文字列の配列をソートすることができます。

以下のサンプルコードでは、strcmpを利用して文字列の配列を昇順にソートします。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 比較関数
int compare(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b); // strcmpを使用
}
int main() {
    const char *strings[] = {"banana", "apple", "cherry", "date"}; // 文字列の配列
    int n = sizeof(strings) / sizeof(strings[0]); // 配列の要素数
    qsort(strings, n, sizeof(const char *), compare); // ソート
    // ソート結果の出力
    for (int i = 0; i < n; i++) {
        printf("%s\n", strings[i]);
    }
    return 0;
}
apple
banana
cherry
date

ユーザー入力の検証に使う

strcmp関数は、ユーザーからの入力を検証する際にも役立ちます。

例えば、特定のパスワードとユーザーが入力したパスワードを比較することができます。

以下のサンプルコードでは、ユーザーが入力したパスワードを検証します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *correctPassword = "secret123"; // 正しいパスワード
    char userInput[50]; // ユーザー入力用の配列
    printf("パスワードを入力してください: ");
    scanf("%49s", userInput); // ユーザーからの入力を取得
    if (strcmp(userInput, correctPassword) == 0) {
        printf("パスワードが正しいです。\n"); // 正しい場合
    } else {
        printf("パスワードが間違っています。\n"); // 間違った場合
    }
    return 0;
}
パスワードを入力してください: secret123
パスワードが正しいです。

辞書順での並び替え

strcmp関数を使用することで、文字列を辞書順に並び替えることができます。

これは、特に文字列のリストを表示する際に便利です。

以下のサンプルコードでは、複数の文字列を辞書順に並べ替えます。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 比較関数
int compare(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b); // strcmpを使用
}
int main() {
    const char *words[] = {"zebra", "apple", "orange", "banana"}; // 文字列の配列
    int n = sizeof(words) / sizeof(words[0]); // 配列の要素数
    qsort(words, n, sizeof(const char *), compare); // 辞書順にソート
    // ソート結果の出力
    for (int i = 0; i < n; i++) {
        printf("%s\n", words[i]);
    }
    return 0;
}
apple
banana
orange
zebra

大文字・小文字を無視した比較(strcasecmp関数の紹介)

大文字と小文字を区別せずに文字列を比較したい場合、strcasecmp関数を使用することができます。

この関数は、strcmpと同様の機能を持ちながら、大文字と小文字を無視して比較を行います。

以下のサンプルコードでは、strcasecmpを使用して文字列を比較します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "Hello"; // 大文字の文字列
    const char *str2 = "hello"; // 小文字の文字列
    if (strcasecmp(str1, str2) == 0) { // 大文字・小文字を無視して比較
        printf("文字列は同じです。\n"); // 同じ場合
    } else {
        printf("文字列は異なります。\n"); // 異なる場合
    }
    return 0;
}
文字列は同じです。

このように、strcasecmpを使用することで、大文字と小文字を無視した比較が簡単に行えます。

これにより、ユーザー入力の検証や文字列の比較がより柔軟になります。

strcmp関数と他の文字列比較関数の違い

strncmp関数との違い

strncmp関数は、strcmp関数と似ていますが、比較する文字数を指定できる点が異なります。

strncmpは、指定した文字数分だけを比較し、文字列の一部だけを評価することができます。

これにより、部分一致の比較が可能になります。

以下のサンプルコードでは、strncmpを使用して最初の3文字だけを比較します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "apple"; // 1つ目の文字列
    const char *str2 = "apricot"; // 2つ目の文字列
    int result = strncmp(str1, str2, 3); // 最初の3文字を比較
    if (result == 0) {
        printf("最初の3文字は同じです。\n"); // 同じ場合
    } else {
        printf("最初の3文字は異なります。\n"); // 異なる場合
    }
    return 0;
}
最初の3文字は異なります。

このように、strncmpを使用することで、特定の文字数だけを比較することができます。

strcasecmp関数との違い

strcasecmp関数は、strcmp関数と同様に文字列を比較しますが、大文字と小文字を区別しない点が異なります。

これにより、ユーザー入力の検証や文字列の比較を行う際に、より柔軟な対応が可能になります。

以下のサンプルコードでは、strcasecmpを使用して大文字・小文字を無視して比較します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str1 = "Hello"; // 大文字の文字列
    const char *str2 = "hello"; // 小文字の文字列
    if (strcasecmp(str1, str2) == 0) { // 大文字・小文字を無視して比較
        printf("文字列は同じです。\n"); // 同じ場合
    } else {
        printf("文字列は異なります。\n"); // 異なる場合
    }
    return 0;
}
文字列は同じです。

このように、strcasecmpを使用することで、大文字と小文字を無視した比較が簡単に行えます。

memcmp関数との違い

memcmp関数は、メモリブロックを比較するための関数であり、文字列だけでなく任意のデータ型のメモリを比較することができます。

strcmpstrncmpが文字列専用であるのに対し、memcmpはバイナリデータの比較にも使用されます。

以下のサンプルコードでは、memcmpを使用して2つのバイナリデータを比較します。

#include <stdio.h>
#include <string.h>
int main() {
    const char data1[] = {0x01, 0x02, 0x03}; // 1つ目のデータ
    const char data2[] = {0x01, 0x02, 0x03}; // 2つ目のデータ
    int result = memcmp(data1, data2, sizeof(data1)); // メモリを比較
    if (result == 0) {
        printf("データは同じです。\n"); // 同じ場合
    } else {
        printf("データは異なります。\n"); // 異なる場合
    }
    return 0;
}
データは同じです。

このように、memcmpを使用することで、任意のメモリブロックを比較することができ、文字列以外のデータ型にも対応しています。

strcmpstrncmpは文字列専用であるため、用途に応じて使い分けることが重要です。

まとめ

この記事では、C言語strcmp関数について、その基本的な使い方や実際の動作、応用例、他の文字列比較関数との違いを詳しく解説しました。

strcmp関数は、文字列の比較を行うための重要なツールであり、特にソートやユーザー入力の検証において非常に役立ちます。

今後は、strcmp関数を活用して、より効率的な文字列処理を行ってみてください。

関連記事

Back to top button