[C言語] 2つの文字列が一致してるか比較する方法を解説

C言語で2つの文字列が一致しているかを比較するには、標準ライブラリの関数strcmpを使用します。

strcmpは、2つの文字列を引数として受け取り、文字列が一致する場合は0を返します。

一致しない場合は、最初に異なる文字のASCII値の差を返します。

この関数はstring.hヘッダーファイルに定義されているため、使用する際にはこのヘッダーファイルをインクルードする必要があります。

文字列の比較は、ユーザー入力の検証やデータの検索など、さまざまな場面で活用されます。

この記事でわかること
  • strcmp関数の基本的な使い方とシンタックス
  • strcmp関数の戻り値の意味とその解釈
  • strcmp関数を使用する際の注意点
  • 他の文字列比較方法とその応用例

目次から探す

strcmp関数の使い方

strcmp関数の概要

strcmp関数は、C言語の標準ライブラリに含まれる文字列比較関数です。

この関数は、2つの文字列を引数として受け取り、それらが同じかどうかを比較します。

具体的には、文字列の各文字を先頭から順に比較し、最初に異なる文字が見つかった時点でその差を返します。

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

strcmp関数のシンタックス

strcmp関数のシンタックスは以下の通りです。

#include <string.h>
int strcmp(const char *str1, const char *str2);
  • str1: 比較する最初の文字列へのポインタ
  • str2: 比較する2番目の文字列へのポインタ

strcmp関数の戻り値の意味

strcmp関数の戻り値は、以下のように解釈されます。

スクロールできます
戻り値意味
0str1str2が同じ
< 0str1str2より辞書順で前
> 0str1str2より辞書順で後

この戻り値を利用して、文字列の比較結果に基づいた処理を行うことができます。

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

このサンプルコードでは、str1str2を比較した結果、str1が辞書順でstr2より前にあるため、負の値が返されます。

一方、str1str3は同じ文字列であるため、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;
}

この例では、str1str2が大文字小文字を無視して比較され、同じ文字列として扱われるため、0が返されます。

strcasecmpが利用できない場合は、文字を一つずつ比較する際にtolowertoupperを使って大文字小文字を統一する方法もあります。

応用例

文字列比較は、さまざまなプログラムで重要な役割を果たします。

ここでは、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;
}

このコードは、filenametargetが一致するかどうかを確認し、一致した場合にメッセージを表示します。

コマンドライン引数の解析

プログラムがコマンドライン引数を受け取る場合、引数の内容を解析して適切な処理を行うことが求められます。

以下の例では、コマンドライン引数を解析して特定のオプションが指定されたかどうかを確認します。

#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といったコマンドラインオプションを解析し、それに応じたメッセージを表示します。

これにより、ユーザーがプログラムの使い方を簡単に理解できるようになります。

よくある質問

strcmp関数はどのくらいの速度ですか?

strcmp関数の速度は、比較する文字列の長さと、最初に異なる文字が見つかる位置に依存します。

一般的に、strcmpは文字列の先頭から順に比較を行うため、最初の数文字が異なる場合は非常に高速に動作します。

しかし、文字列が長く、ほとんどの部分が一致している場合は、比較に時間がかかることがあります。

最適化されたライブラリを使用することで、速度が向上することもあります。

なぜstrcmp関数は0を返すのですか?

strcmp関数が0を返すのは、2つの文字列が完全に一致していることを示すためです。

C言語では、0は「等しい」または「真」を意味することが多く、strcmpもこの慣習に従っています。

0以外の値は、文字列が異なることを示し、その値の正負は文字列の辞書順序を示します。

大文字小文字を区別しない比較はどうすればいいですか?

大文字小文字を区別しない文字列比較を行うには、strcasecmp関数を使用するのが一般的です。

この関数は、POSIX標準の一部であり、strcmpと同様のインターフェースを持ちながら、大文字小文字を無視して比較を行います。

もしstrcasecmpが利用できない環境であれば、tolowertoupperを使って文字列を変換し、strcmpで比較する方法もあります。

まとめ

文字列比較はC言語プログラミングにおいて重要な操作であり、strcmp関数はその基本的な手段です。

この記事では、strcmp関数の使い方や注意点、他の文字列比較方法について詳しく解説しました。

これらの知識を活用して、文字列操作をより効果的に行いましょう。

今後は、実際のプログラムでこれらの関数を試し、理解を深めてみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す