【C言語】文字列の検索方法を解説(文字指定・文字列指定)

この記事では、C言語で文字列の中から特定の文字や文字列を見つける方法について解説します。

具体的には、strstr関数strcasestr関数の使い方、そしてそれらを使った応用例を紹介します。

これを読むことで、C言語での文字列検索の基本から応用までを理解できるようになります。

初心者の方でもわかりやすいように、サンプルコードとその実行結果を交えて説明しますので、ぜひ参考にしてください。

目次から探す

文字列の検索方法

C言語で文字列を検索する方法はいくつかありますが、ここでは代表的な関数であるstrstrstrcasestrについて解説します。

これらの関数を使うことで、特定の文字列を別の文字列の中から簡単に見つけることができます。

strstr関数の使い方

strstrの基本的な使い方

strstr関数は、ある文字列の中から特定の文字列を検索するための標準ライブラリ関数です。

以下のように使用します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *haystack = "Hello, world!";
    const char *needle = "world";
    char *result;
    result = strstr(haystack, needle);
    if (result != NULL) {
        printf("Found: %s\n", result);
    } else {
        printf("Not found\n");
    }
    return 0;
}

この例では、haystackという文字列の中からneedleという文字列を検索しています。

strstr関数は、見つかった場合にはその位置へのポインタを返し、見つからなかった場合にはNULLを返します。

strstrの戻り値とエラーハンドリング

strstr関数の戻り値は、検索対象の文字列が見つかった場合にはその位置へのポインタ、見つからなかった場合にはNULLです。

これを利用してエラーハンドリングを行うことができます。

#include <stdio.h>
#include <string.h>
int main() {
    const char *haystack = "Hello, world!";
    const char *needle = "planet";
    char *result;
    result = strstr(haystack, needle);
    if (result != NULL) {
        printf("Found: %s\n", result);
    } else {
        printf("Not found\n");
    }
    return 0;
}

この例では、needlehaystackの中に存在しないため、strstrNULLを返し、 Not found と表示されます。

strcasestr関数の使い方(POSIX標準)

strcasestrの基本的な使い方

strcasestr関数は、strstrと同様に文字列を検索しますが、大文字と小文字を区別しない点が異なります。

この関数はPOSIX標準であり、以下のように使用します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *haystack = "Hello, World!";
    const char *needle = "world";
    char *result;
    result = strcasestr(haystack, needle);
    if (result != NULL) {
        printf("Found: %s\n", result);
    } else {
        printf("Not found\n");
    }
    return 0;
}

この例では、haystackの中にneedleが大文字小文字を区別せずに存在するため、strcasestrはその位置へのポインタを返します。

strcasestrの戻り値とエラーハンドリング

strcasestr関数の戻り値もstrstrと同様に、検索対象の文字列が見つかった場合にはその位置へのポインタ、見つからなかった場合にはNULLです。

これを利用してエラーハンドリングを行うことができます。

#include <stdio.h>
#include <string.h>
int main() {
    const char *haystack = "Hello, World!";
    const char *needle = "planet";
    char *result;
    result = strcasestr(haystack, needle);
    if (result != NULL) {
        printf("Found: %s\n", result);
    } else {
        printf("Not found\n");
    }
    return 0;
}

この例では、needlehaystackの中に存在しないため、strcasestrNULLを返し、 Not found と表示されます。

以上が、strstrstrcasestr関数を使った文字列の検索方法の基本的な使い方とエラーハンドリングの方法です。

これらの関数を使うことで、文字列の中から特定の文字列を簡単に見つけることができます。

応用例

文字列内の全ての特定文字を検索

文字列内の特定の文字をすべて検索する場合、strchr関数を使うことが一般的です。

しかし、strchr関数は最初に見つかった文字の位置しか返さないため、ループを使って全ての位置を検索する必要があります。

ループを使った検索方法

以下の手順で文字列内の全ての特定文字を検索します。

  1. strchr関数を使って最初の特定文字の位置を見つける。
  2. 見つかった位置の次の位置から再度strchr関数を使って次の特定文字を検索する。
  3. 文字列の終わりまでこの操作を繰り返す。

実装例

以下に、文字列内の全ての特定文字を検索するC言語のサンプルコードを示します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "This is a sample string.";
    char target = 's';
    char *pos = str;
    printf("Target character: '%c'\n", target);
    printf("String: \"%s\"\n", str);
    printf("Positions: ");
    while ((pos = strchr(pos, target)) != NULL) {
        printf("%ld ", pos - str);
        pos++; // 次の位置から検索を続ける
    }
    printf("\n");
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

Target character: 's'
String: "This is a sample string."
Positions: 3 6 10 17

この出力から、文字’s’が文字列内の3番目、6番目、10番目、17番目の位置に存在することがわかります。

文字列内の全ての特定文字列を検索

文字列内の特定の文字列をすべて検索する場合、strstr関数を使うことが一般的です。

しかし、strstr関数も最初に見つかった文字列の位置しか返さないため、ループを使って全ての位置を検索する必要があります。

ループを使った検索方法

以下の手順で文字列内の全ての特定文字列を検索します。

  1. strstr関数を使って最初の特定文字列の位置を見つける。
  2. 見つかった位置の次の位置から再度strstr関数を使って次の特定文字列を検索する。
  3. 文字列の終わりまでこの操作を繰り返す。

実装例

以下に、文字列内の全ての特定文字列を検索するC言語のサンプルコードを示します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "This is a test. This test is simple.";
    char target[] = "test";
    char *pos = str;
    printf("Target string: \"%s\"\n", target);
    printf("String: \"%s\"\n", str);
    printf("Positions: ");
    while ((pos = strstr(pos, target)) != NULL) {
        printf("%ld ", pos - str);
        pos += strlen(target); // 次の位置から検索を続ける
    }
    printf("\n");
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

Target string: "test"
String: "This is a test. This test is simple."
Positions: 10 21

この出力から、文字列testが文字列内の10番目と21番目の位置に存在することがわかります。

以上のように、strchrstrstr関数を使って文字列内の特定の文字や文字列を検索する方法を理解することで、C言語での文字列操作がより効率的に行えるようになります。

目次から探す