文字列処理

[C言語] strstr関数の使い方 – 文字列から文字列を検索する

strstr関数は、C言語で文字列の中から特定の部分文字列を検索するために使用されます。

strstrは、最初の引数に検索対象の文字列、2番目の引数に検索したい部分文字列を指定します。

部分文字列が見つかると、その部分文字列が最初に現れる位置のポインタを返し、見つからない場合はNULLを返します。

例えば、strstr("hello world", "world")"world"へのポインタを返します。

strstr関数とは

strstr関数は、C言語の標準ライブラリに含まれる文字列操作関数の一つで、指定した文字列の中から部分文字列を検索するために使用されます。

この関数は、最初の引数に検索対象の文字列、第二の引数に検索したい部分文字列を取ります。

strstr関数は、部分文字列が最初に出現する位置を指すポインタを返し、見つからなかった場合はNULLを返します。

これにより、文字列の中で特定のパターンを探す際に非常に便利です。

特に、テキスト処理やデータ解析の場面で頻繁に利用されます。

strstr関数は大文字と小文字を区別するため、検索時には注意が必要です。

strstr関数の使い方

基本的な使用例

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

この例では、文字列の中から部分文字列を検索し、その結果を表示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。";
    const char *search = "プログラミング";
    
    // strstr関数を使用して部分文字列を検索
    const char *result = strstr(text, search);
    
    if (result != NULL) {
        printf("見つかりました: %s\n", result);
    } else {
        printf("見つかりませんでした。\n");
    }
    return 0;
}
見つかりました: プログラミング言語です。

このコードでは、textの中からsearchを検索し、見つかった場合はその位置からの文字列を表示します。

部分文字列が見つかった場合の挙動

strstr関数が部分文字列を見つけた場合、見つかった位置を指すポインタを返します。

このポインタは、元の文字列の中で部分文字列が最初に出現する位置を示します。

上記の例では、"プログラミング"が見つかり、その位置からの文字列が表示されました。

部分文字列が見つからなかった場合の挙動

部分文字列が見つからなかった場合、strstr関数はNULLを返します。

これにより、検索結果が存在しないことを簡単に確認できます。

上記の例で、もしsearchに存在しない文字列を指定した場合、"見つかりませんでした。"と表示されます。

大文字・小文字の区別について

strstr関数は大文字と小文字を区別します。

つまり、例えば"abc""ABC"は異なる文字列として扱われます。

したがって、検索時には大文字・小文字の違いに注意が必要です。

例えば、strstr("Hello World", "hello")はNULLを返しますが、strstr("Hello World", "Hello")は部分文字列を見つけることができます。

strstr関数の実際の使用例

部分文字列の検索

strstr関数を使用して、特定の部分文字列を検索する方法を示します。

以下のサンプルコードでは、文字列の中から部分文字列を検索し、見つかった場合はその結果を表示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。C言語は多くの分野で使用されています。";
    const char *search = "C言語";
    
    // 部分文字列を検索
    const char *result = strstr(text, search);
    
    if (result != NULL) {
        printf("見つかりました: %s\n", result);
    } else {
        printf("見つかりませんでした。\n");
    }
    return 0;
}
見つかりました: C言語はプログラミング言語です。C言語は多くの分野で使用されています。

このコードでは、textの中からsearchを検索し、見つかった場合はその位置からの文字列を表示します。

部分文字列の位置を取得する

strstr関数を使用して、部分文字列が見つかった位置を取得することもできます。

以下のサンプルコードでは、見つかった部分文字列の先頭アドレスを表示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。";
    const char *search = "プログラミング";
    
    // 部分文字列を検索
    const char *result = strstr(text, search);
    
    if (result != NULL) {
        // 部分文字列の位置を表示
        printf("部分文字列の位置: %ld\n", result - text);
    } else {
        printf("見つかりませんでした。\n");
    }
    return 0;
}
部分文字列の位置: 7

このコードでは、resultが指す位置からtextの先頭までのオフセットを計算し、部分文字列の位置を表示します。

部分文字列が存在するかどうかの確認

strstr関数を使って、部分文字列が存在するかどうかを確認する方法を示します。

以下のサンプルコードでは、部分文字列が存在するかをチェックし、結果を表示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。";
    const char *search = "Python";
    
    // 部分文字列の存在を確認
    if (strstr(text, search) != NULL) {
        printf("部分文字列は存在します。\n");
    } else {
        printf("部分文字列は存在しません。\n");
    }
    return 0;
}
部分文字列は存在しません。

このコードでは、searchtextに存在するかどうかを確認し、結果を表示します。

複数回の検索を行う方法

strstr関数を使用して、文字列内で複数回部分文字列を検索する方法を示します。

以下のサンプルコードでは、部分文字列が見つかるたびにその位置を表示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。C言語は多くの分野で使用されています。";
    const char *search = "C言語";
    const char *result = text;
    
    // 複数回の検索
    while ((result = strstr(result, search)) != NULL) {
        printf("見つかりました: %s\n", result);
        result++; // 次の検索のためにポインタを進める
    }
    return 0;
}
見つかりました: C言語はプログラミング言語です。C言語は多くの分野で使用されています。
見つかりました: C言語は多くの分野で使用されています。

このコードでは、whileループを使用して、text内でsearchが見つかるたびにその位置からの文字列を表示します。

ポインタを進めることで、次の検索を行うことができます。

strstr関数の注意点

NULLポインタの扱い

strstr関数を使用する際、検索対象の文字列や部分文字列がNULLポインタである場合、未定義の動作を引き起こす可能性があります。

したがって、strstrを呼び出す前に、引数がNULLでないことを確認することが重要です。

以下のサンプルコードでは、NULLポインタのチェックを行っています。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = NULL;
    const char *search = "テスト";
    
    // NULLポインタのチェック
    if (text != NULL && search != NULL) {
        const char *result = strstr(text, search);
        if (result != NULL) {
            printf("見つかりました: %s\n", result);
        } else {
            printf("見つかりませんでした。\n");
        }
    } else {
        printf("文字列がNULLです。\n");
    }
    return 0;
}
文字列がNULLです。

このコードでは、textがNULLであるため、適切なメッセージが表示されます。

空文字列を検索する場合の挙動

strstr関数で空文字列を検索する場合、常に検索対象の文字列の先頭を指すポインタが返されます。

これは、空文字列は任意の文字列の先頭に存在すると見なされるためです。

以下のサンプルコードでこの挙動を示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。";
    const char *search = ""; // 空文字列
    
    // 空文字列を検索
    const char *result = strstr(text, search);
    
    if (result != NULL) {
        printf("見つかりました: %s\n", result); // 文字列の先頭が表示される
    } else {
        printf("見つかりませんでした。\n");
    }
    return 0;
}
見つかりました: C言語はプログラミング言語です。

このコードでは、空文字列が見つかり、元の文字列の先頭が表示されます。

部分文字列が複数回出現する場合の挙動

strstr関数は、最初に見つかった部分文字列の位置を返しますが、複数回出現する場合は、次の出現を見つけるためにポインタを進める必要があります。

以下のサンプルコードでは、部分文字列が複数回出現する場合の挙動を示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。C言語は多くの分野で使用されています。";
    const char *search = "C言語";
    const char *result = text;
    
    // 複数回の検索
    while ((result = strstr(result, search)) != NULL) {
        printf("見つかりました: %s\n", result);
        result++; // 次の検索のためにポインタを進める
    }
    return 0;
}
見つかりました: C言語はプログラミング言語です。C言語は多くの分野で使用されています。
見つかりました: C言語は多くの分野で使用されています。

このコードでは、whileループを使用して、text内でsearchが見つかるたびにその位置からの文字列を表示します。

マルチバイト文字列での使用に関する注意

strstr関数は、マルチバイト文字列(例えば、UTF-8エンコーディングの文字列)に対しても使用できますが、注意が必要です。

マルチバイト文字列では、部分文字列の検索が意図した通りに動作しない場合があります。

特に、部分文字列がマルチバイト文字で構成されている場合、正しく検索できないことがあります。

以下のサンプルコードでは、マルチバイト文字列を使用した例を示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "こんにちは、C言語の世界へ!";
    const char *search = "C言語";
    
    // マルチバイト文字列を検索
    const char *result = strstr(text, search);
    
    if (result != NULL) {
        printf("見つかりました: %s\n", result);
    } else {
        printf("見つかりませんでした。\n");
    }
    return 0;
}
見つかりました: C言語の世界へ!

このコードでは、マルチバイト文字列の中からsearchを検索し、正しく見つけることができましたが、他のエンコーディングや文字セットに対しては注意が必要です。

特に、マルチバイト文字列を扱う場合は、mbstowcswcstombsなどの関数を使用して、適切に変換することが推奨されます。

応用例

部分文字列の置換

strstr関数を使用して、文字列内の部分文字列を別の文字列に置換する方法を示します。

以下のサンプルコードでは、指定した部分文字列を新しい文字列に置換します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* replaceSubstring(const char* text, const char* oldSubstr,
                       const char* newSubstr) {
    const char* pos = strstr(text, oldSubstr);
    if (pos == NULL) {
        return strdup(text); // 部分文字列が見つからない場合は元の文字列を返す
    }

    size_t newLength = strlen(text) - strlen(oldSubstr) + strlen(newSubstr);
    char* result = (char*)malloc(newLength + 1);

    // 置換処理
    size_t prefixLength = pos - text;
    strncpy(result, text, prefixLength); // 元の文字列の前半をコピー
    strcpy(result + prefixLength, newSubstr); // 新しい部分文字列を追加
    strcpy(result + prefixLength + strlen(newSubstr),
           pos + strlen(oldSubstr)); // 残りの文字列を追加

    return result;
}
int main() {
    const char* text = "C言語はプログラミング言語です。";
    const char* oldSubstr = "プログラミング";
    const char* newSubstr = "Programming";

    char* result = replaceSubstring(text, oldSubstr, newSubstr);
    printf("置換結果: %s\n", result);

    free(result); // メモリの解放
    return 0;
}
置換結果: C言語はProgramming言語です。

このコードでは、replaceSubstring関数を定義し、部分文字列を置換しています。

部分文字列のカウント

strstr関数を使用して、文字列内に出現する部分文字列の回数をカウントする方法を示します。

以下のサンプルコードでは、指定した部分文字列が何回出現するかを数えます。

#include <stdio.h>
#include <string.h>
int countSubstrings(const char* text, const char* search) {
    int count = 0;
    const char* result = text;
    
    while ((result = strstr(result, search)) != NULL) {
        count++;
        result++; // 次の検索のためにポインタを進める
    }
    
    return count;
}
int main() {
    const char *text = "C言語はプログラミング言語です。C言語は多くの分野で使用されています。";
    const char *search = "C言語";
    
    int count = countSubstrings(text, search);
    printf("部分文字列の出現回数: %d\n", count);
    
    return 0;
}
部分文字列の出現回数: 2

このコードでは、countSubstrings関数を使用して、部分文字列の出現回数をカウントしています。

部分文字列の削除

strstr関数を使用して、文字列内の部分文字列を削除する方法を示します。

以下のサンプルコードでは、指定した部分文字列を削除します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* removeSubstring(const char* text, const char* substr) {
    const char* pos = strstr(text, substr);
    if (pos == NULL) {
        return strdup(text); // 部分文字列が見つからない場合は元の文字列を返す
    }
    
    size_t newLength = strlen(text) - strlen(substr);
    char* result = (char*)malloc(newLength + 1);
    
    // 削除処理
    size_t prefixLength = pos - text;
    strncpy(result, text, prefixLength); // 元の文字列の前半をコピー
    strcpy(result + prefixLength, pos + strlen(substr)); // 残りの文字列を追加
    
    return result;
}
int main() {
    const char *text = "C言語はプログラミング言語です。";
    const char *substr = "プログラミング";
    
    char *result = removeSubstring(text, substr);
    printf("削除結果: %s\n", result);
    
    free(result); // メモリの解放
    return 0;
}
削除結果: C言語は言語です。

このコードでは、removeSubstring関数を使用して、部分文字列を削除しています。

部分文字列の抽出

strstr関数を使用して、文字列内から部分文字列を抽出する方法を示します。

以下のサンプルコードでは、指定した部分文字列を抽出します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* extractSubstring(const char* text, const char* substr) {
    const char* pos = strstr(text, substr);
    if (pos == NULL) {
        return NULL; // 部分文字列が見つからない場合はNULLを返す
    }
    
    return strdup(pos); // 部分文字列の先頭からコピー
}
int main() {
    const char *text = "C言語はプログラミング言語です。";
    const char *substr = "プログラミング";
    
    char *result = extractSubstring(text, substr);
    if (result != NULL) {
        printf("抽出結果: %s\n", result);
        free(result); // メモリの解放
    } else {
        printf("部分文字列が見つかりませんでした。\n");
    }
    
    return 0;
}
抽出結果: プログラミング言語です。

このコードでは、extractSubstring関数を使用して、部分文字列を抽出しています。

複数の部分文字列を同時に検索する方法

複数の部分文字列を同時に検索する方法を示します。

以下のサンプルコードでは、指定した複数の部分文字列が文字列内に存在するかを確認します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *text = "C言語はプログラミング言語です。Pythonも人気です。";
    const char *search1 = "C言語";
    const char *search2 = "Python";
    
    // 複数の部分文字列を検索
    if (strstr(text, search1) != NULL) {
        printf("%sが見つかりました。\n", search1);
    } else {
        printf("%sが見つかりませんでした。\n", search1);
    }
    
    if (strstr(text, search2) != NULL) {
        printf("%sが見つかりました。\n", search2);
    } else {
        printf("%sが見つかりませんでした。\n", search2);
    }
    
    return 0;
}
C言語が見つかりました。
Pythonが見つかりました。

このコードでは、strstr関数を使用して、複数の部分文字列が存在するかを確認しています。

まとめ

この記事では、C言語strstr関数について、その基本的な使い方や実際の使用例、注意点、応用例を詳しく解説しました。

strstr関数は、文字列から部分文字列を検索するための非常に便利なツールであり、特にテキスト処理やデータ解析の場面で役立ちます。

今後は、実際のプログラムにstrstr関数を活用し、文字列操作の効率を向上させてみてください。

関連記事

Back to top button