Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のstrstr()関数とは?文字列検索の使い方とサンプルコード解説

C言語の標準ライブラリ関数 char *strstr(const char *haystack, const char *needle) は、文字列 haystack(検索対象となる主文字列)の中から、部分文字列 needle(検索したい文字列)が最初に現れる位置を探すための関数です。なお、終端の '\0'(ヌル文字)は比較の対象になりません。

C言語では、文字型の配列のことを「文字列」と呼びます。

文字列の宣言

文字列(文字配列)を宣言する構文は以下のとおりです。

char 文字列名 [サイズ];

例えば「char string[50];」と宣言すれば、50文字分の長さを持つ文字列が定義されます。

文字列の初期化

  • 1文字ずつの文字定数で初期化する場合
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
  • 文字列定数で初期化する場合
char string[10] = "Hello";

アクセス方法 − 文字列の入出力には制御文字列 "%s" を使用します。"%s" はヌル文字 '\0' に到達するまで文字列を読み書きします。

strstr()関数とは

  • 主文字列の中に部分文字列が含まれているかどうかを検索するために使用します。
  • 見つかった場合は、主文字列 s1 の中で部分文字列 s2 が最初に現れた位置へのポインタを返します。見つからなかった場合は NULL を返します。
  • strstr() を使用するには、ヘッダファイル <string.h> をインクルードする必要があります。

構文

strstr() 関数の構文は以下のとおりです。

strstr(主文字列, 部分文字列);

サンプルプログラム1

次のプログラムは、strstr() 関数の基本的な使い方を示したものです。

#include<stdio.h>
void main(){
    char a[30],b[30];
    char *found;
    printf("Enter a string:\n");
    gets(a);
    printf("Enter the string to be searched for:\n");
    gets(b);
    found=strstr(a,b);
    if(found)
        printf("%s is found in %s in %d position",a,b,found-a);
    else
        printf("-1 since the string is not found");
}

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。

Enter a string: how are you
Enter the string to be searched for: you
you is found in 8 position

サンプルプログラム2

続いて、strstr() 関数を使った別のプログラムを見てみましょう。

以下は、ライブラリ関数 strstr() を利用して、ある文字列が別の文字列の部分文字列として存在するかどうかを判定するCプログラムです。

#include<stdio.h>
#include<string.h>
void main(){
    //2つの文字列を宣言//
    char mainstring[50],substring[50];
    char *exists;
    //文字列の読み込み//
    printf("Enter the main string : \n ");
    gets(mainstring);
    printf("Enter the sub string you would want to check if exists in main string :");
    gets(substring);
    //ライブラリ関数を使って主文字列内の部分文字列を検索//
    exists = strstr(mainstring,substring);
    //条件分岐//
    if(exists){
        printf("%s exists in %s ",substring,mainstring);
    } else {
        printf("'%s' is not present in '%s'",substring,mainstring);
    }
}

実行結果

上記のプログラムを実行すると、次のような結果が出力されます。

Enter the main string : TutorialsPoint c Programming
Enter the sub string you would want to check if exists in main string :Programming
Programming exists in TutorialsPoint c Programming

注意:gets()関数について

上記のサンプルコードで使用している gets() 関数は、入力サイズを制限できずバッファオーバーフローを引き起こす危険があるため、現在では非推奨とされており、C11規格では標準ライブラリから削除されています。実際の開発では、入力サイズを指定できる fgets() の使用が推奨されます。

  1. C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説

    C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1

  2. C言語のstrcpy()関数とは?基本構文と使い方をわかりやすく解説

    C言語のライブラリ関数 char *strcpy(char *dest, const char *src) は、src が指し示す文字列を dest にコピーするための関数です。 C言語では、文字の配列のことを「文字列」と呼びます。 文字列の宣言 文字列(文字配列)の宣言は、以下の形式で行います。 char stringname[size]; 例えば char string[50]; と宣言すると、最大50文字の文字列を格納できる配列が確保されます。 文字列の初期化 文字列の初期化には、主に以下の2つの方法があります。 1. 文字定数を使う方法 char string[10] = {H,