C 言語で文字列にサブストリングが含まれているかどうかをチェックする

胡金庫 2023年10月12日
  1. 文字列が C 言語で部分文字列を含むかどうかを調べるには strstrstr 関数を使用する
  2. 文字列が部分文字列を含むかどうかを調べるには、strcasestr 関数を用いる
  3. 関数 strncpy を用いて部分文字列をコピーする
C 言語で文字列にサブストリングが含まれているかどうかをチェックする

この記事では、C 言語で文字列が与えられた部分文字列を含むかどうかを調べる方法をいくつか説明します。

文字列が C 言語で部分文字列を含むかどうかを調べるには strstrstr 関数を使用する

関数 strstrstr は C 標準ライブラリの文字列機能の一部であり、<string.h> ヘッダで定義されています。この関数は 2つの char ポインタの引数をとり、最初の引数は検索対象の文字列を表し、もう 1つは検索対象の文字列を表します。この関数は、与えられた部分文字列の最初の開始アドレスを見つけ、対応する char へのポインタを返します。第一引数の文字列に部分文字列が見つからなかった場合、NULL ポインタが返されています。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char *tmp = "This string literal is arbitrary";

int main(int argc, char *argv[]) {
  char *ret;

  ret = strstr(tmp, "literal");
  if (ret)
    printf("found substring at address %p\n", ret);
  else
    printf("no substring found!\n");

  exit(EXIT_SUCCESS);
}

出力:

found substring at address 0x55edd2ecc014

文字列が部分文字列を含むかどうかを調べるには、strcasestr 関数を用いる

strcasestr は標準ライブラリの機能には含まれていないが、GNU C ライブラリの拡張機能として実装されており、_GNU_SOURCE マクロの定義で指定できます。一度定義されると、与えられた部分文字列の最初の出現を見つけるために strcasestr 関数を呼び出すことができます。ただし、この関数は両方の文字列の大文字小文字を無視することに注意してください。

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char *tmp = "This string literal is arbitrary";

int main(int argc, char *argv[]) {
  char *ret;

  ret = strcasestr(tmp, "LITERAL");
  if (ret)
    printf("found substring at address %p\n", ret);
  else
    printf("no substring found!\n");

  exit(EXIT_SUCCESS);
}

出力:

found substring at address 0x55edd2ecc014

関数 strncpy を用いて部分文字列をコピーする

あるいは、strncpy 関数を用いて、与えられた部分文字列を新しいバッファにコピーすることもできます。最初の引数はコピー先の char ポインタであり、コピーされた部分文字列が格納されています。第二引数はコピー元の文字列であり、最後の引数は最大でも最初にコピーするバイト数を示します。ソース文字列の最初のバイトにヌルバイトが見つからなかった場合、コピー先の文字列はヌル終端にならないことに注意してください。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char *tmp = "This string literal is arbitrary";

int main(int argc, char *argv[]) {
  char *str = malloc(strlen(tmp));

  printf("%s\n", strncpy(str, tmp, 4));
  printf("%s\n", strncpy(str, tmp + 5, 10));

  free(str);
  exit(EXIT_SUCCESS);
}

出力:

This
string lit
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C String