[C言語] 2つの文字列が一致してるか比較する方法を解説
C言語で2つの文字列が一致しているかを比較するには、標準ライブラリの関数strcmpを使用します。
strcmpは、2つの文字列を引数として受け取り、文字列が一致する場合は0を返します。
一致しない場合は、最初に異なる文字のASCII値の差を返します。
この関数はstring.hヘッダーファイルに定義されているため、使用する際にはこのヘッダーファイルをインクルードする必要があります。
文字列の比較は、ユーザー入力の検証やデータの検索など、さまざまな場面で活用されます。
strcmp関数の使い方
strcmp関数の概要
strcmp関数は、C言語の標準ライブラリに含まれる文字列比較関数です。
この関数は、2つの文字列を引数として受け取り、それらが同じかどうかを比較します。
具体的には、文字列の各文字を先頭から順に比較し、最初に異なる文字が見つかった時点でその差を返します。
もし、すべての文字が一致する場合は、0を返します。
strcmp関数のシンタックス
strcmp関数のシンタックスは以下の通りです。
#include <string.h>
int strcmp(const char *str1, const char *str2);- str1: 比較する最初の文字列へのポインタ
- str2: 比較する2番目の文字列へのポインタ
strcmp関数の戻り値の意味
strcmp関数の戻り値は、以下のように解釈されます。
| 戻り値 | 意味 | 
|---|---|
| 0 | str1とstr2が同じ | 
| < 0 | str1がstr2より辞書順で前 | 
| > 0 | str1がstr2より辞書順で後 | 
この戻り値を利用して、文字列の比較結果に基づいた処理を行うことができます。
strcmp関数を使ったサンプルコード
以下は、strcmp関数を使って2つの文字列を比較するサンプルコードです。
#include <stdio.h>
#include <string.h>
int main() {
    // 文字列の定義
    const char *str1 = "apple";
    const char *str2 = "orange";
    const char *str3 = "apple";
    // strcmp関数を使って比較
    int result1 = strcmp(str1, str2);
    int result2 = strcmp(str1, str3);
    // 結果の表示
    printf("str1とstr2の比較結果: %d\n", result1);
    printf("str1とstr3の比較結果: %d\n", result2);
    return 0;
}str1とstr2の比較結果: -1
str1とstr3の比較結果: 0このサンプルコードでは、str1とstr2を比較した結果、str1が辞書順でstr2より前にあるため、負の値が返されます。
一方、str1とstr3は同じ文字列であるため、0が返されます。
これにより、strcmp関数が文字列の比較にどのように役立つかを確認できます。
strcmp関数の注意点
strcmp関数を使用する際には、いくつかの注意点があります。
これらの点を理解しておくことで、意図しない動作を避けることができます。
NULLポインタの扱い
strcmp関数は、引数として渡されたポインタが指す文字列を比較します。
そのため、引数としてNULLポインタを渡すと、未定義の動作を引き起こします。
これは、NULLポインタが指す先が存在しないため、比較を行うことができないからです。
したがって、strcmpを使用する前に、ポインタがNULLでないことを確認する必要があります。
大文字と小文字の区別
strcmp関数は、大文字と小文字を区別して比較を行います。
つまり、”Apple”と”apple”は異なる文字列として扱われます。
このため、文字列の比較において大文字と小文字を区別したくない場合は、別の方法を用いる必要があります。
例えば、strcasecmp関数(POSIX標準)を使用することで、大文字小文字を無視した比較が可能です。
ロケールの影響
strcmp関数は、ロケールに依存しない比較を行います。
つまり、文字の比較はASCIIコードに基づいて行われ、ロケール設定による影響を受けません。
したがって、ロケールに依存した文字列の比較が必要な場合は、strcoll関数を使用することが推奨されます。
strcollは、現在のロケールに基づいて文字列を比較します。
これらの注意点を理解し、適切に対処することで、strcmp関数をより効果的に使用することができます。
他の文字列比較方法
strcmp関数以外にも、C言語には文字列を比較するためのさまざまな方法があります。
ここでは、strncmp関数、自作の文字列比較関数、大文字小文字を無視した比較方法について解説します。
strncmp関数の使い方
strncmp関数は、指定した文字数だけを比較するための関数です。
strcmpと異なり、部分的な文字列の比較が可能です。
シンタックスは以下の通りです。
#include <string.h>
int strncmp(const char *str1, const char *str2, size_t n);- str1: 比較する最初の文字列へのポインタ
- str2: 比較する2番目の文字列へのポインタ
- n: 比較する最大文字数
strncmp関数は、strcmpと同様に、0、負の値、正の値を返しますが、最大でn文字までの比較を行います。
自作の文字列比較関数
特定の条件に基づいて文字列を比較したい場合、自作の文字列比較関数を作成することができます。
以下は、2つの文字列が同じかどうかを確認する簡単な自作関数の例です。
#include <stdio.h>
int my_strcmp(const char *str1, const char *str2) {
    while (*str1 && (*str1 == *str2)) {
        str1++;
        str2++;
    }
    return *(unsigned char *)str1 - *(unsigned char *)str2;
}
int main() {
    const char *str1 = "hello";
    const char *str2 = "hello";
    const char *str3 = "world";
    printf("str1とstr2の比較結果: %d\n", my_strcmp(str1, str2));
    printf("str1とstr3の比較結果: %d\n", my_strcmp(str1, str3));
    return 0;
}この関数は、strcmpと同様の動作をしますが、特定の条件に応じてカスタマイズすることが可能です。
大文字小文字を無視した比較方法
大文字小文字を無視して文字列を比較したい場合、strcasecmp関数(POSIX標準)を使用することができます。
ただし、これは標準Cライブラリには含まれていないため、環境によっては使用できないことがあります。
以下は、strcasecmpを使った例です。
#include <stdio.h>
#include <strings.h> // POSIX標準
int main() {
    const char *str1 = "Hello";
    const char *str2 = "hello";
    int result = strcasecmp(str1, str2);
    printf("str1とstr2の大文字小文字を無視した比較結果: %d\n", result);
    return 0;
}この例では、str1とstr2が大文字小文字を無視して比較され、同じ文字列として扱われるため、0が返されます。
strcasecmpが利用できない場合は、文字を一つずつ比較する際にtolowerやtoupperを使って大文字小文字を統一する方法もあります。
応用例
文字列比較は、さまざまなプログラムで重要な役割を果たします。
ここでは、strcmp関数やその他の文字列比較方法を用いた応用例を紹介します。
ユーザー入力の検証
ユーザーからの入力を検証する際に、文字列比較は非常に役立ちます。
例えば、ユーザーが特定のコマンドを入力したかどうかを確認する場合、strcmpを使用して入力された文字列と期待する文字列を比較します。
#include <stdio.h>
#include <string.h>
int main() {
    char input[100];
    printf("コマンドを入力してください: ");
    scanf("%99s", input);
    if (strcmp(input, "exit") == 0) {
        printf("プログラムを終了します。\n");
    } else {
        printf("不明なコマンド: %s\n", input);
    }
    return 0;
}この例では、ユーザーが”exit”と入力した場合にプログラムを終了する処理を行っています。
ファイル名の一致確認
ファイル操作を行う際に、特定のファイル名と一致するかどうかを確認することがよくあります。
以下の例では、指定されたファイル名が存在するかどうかを確認します。
#include <stdio.h>
#include <string.h>
int main() {
    const char *filename = "data.txt";
    const char *target = "data.txt";
    if (strcmp(filename, target) == 0) {
        printf("ファイル名が一致しました。\n");
    } else {
        printf("ファイル名が一致しません。\n");
    }
    return 0;
}このコードは、filenameとtargetが一致するかどうかを確認し、一致した場合にメッセージを表示します。
コマンドライン引数の解析
プログラムがコマンドライン引数を受け取る場合、引数の内容を解析して適切な処理を行うことが求められます。
以下の例では、コマンドライン引数を解析して特定のオプションが指定されたかどうかを確認します。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "--help") == 0) {
            printf("ヘルプメッセージを表示します。\n");
        } else if (strcmp(argv[i], "--version") == 0) {
            printf("バージョン情報を表示します。\n");
        } else {
            printf("不明なオプション: %s\n", argv[i]);
        }
    }
    return 0;
}このプログラムは、--helpや--versionといったコマンドラインオプションを解析し、それに応じたメッセージを表示します。
これにより、ユーザーがプログラムの使い方を簡単に理解できるようになります。
まとめ
文字列比較はC言語プログラミングにおいて重要な操作であり、strcmp関数はその基本的な手段です。
この記事では、strcmp関数の使い方や注意点、他の文字列比較方法について詳しく解説しました。
これらの知識を活用して、文字列操作をより効果的に行いましょう。
今後は、実際のプログラムでこれらの関数を試し、理解を深めてみてください。
 
![[C言語] atol関数の使い方 – 文字列をlong型数値に変換する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47138.png)
![[C言語] atof関数の使い方 – 文字列を浮動小数(double)に変換する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47137.png)
![[C言語] sprintf関数の使い方 – 複数の変数を文字列にフォーマット](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47139.png)
![[C言語] sscanf関数の使い方 – フォーマット指定でファイルから読み込む](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47140.png)
![[C言語] strcat 使い方 – 文字列の連結](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47141.png)
![[C言語] strcpy関数の使い方 – 文字列をコピーする](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47144.png)
![[C言語] strcmp関数の使い方 – 文字列を比較する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47143.png)
![[C言語] strchr関数の使い方 – 最初に見つかった文字の位置を取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47142.png)
![[C言語] strncat関数の使い方 – 指定文字分結合](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47148.png)
![[C言語] strlen関数の使い方 – 文字列の長さ(バイト数)の取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47147.png)
![[C言語] stricmp関数の使い方 – 大文字小文字を区別しない比較](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47146.png)
![[C言語] strcspn関数の使い方 – 文字群が含まれる位置を検索](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47145.png)