Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
strstr() / strchr() / strrchr()
文字列の中から特定の部分文字列や文字を検索する関数です。パーサやログ解析など、文字列の中から情報を取り出す処理によく使います。
構文
// haystack の中から needle を検索します。 // 戻り値: 最初に見つかった位置へのポインタ、見つからなければ NULL。 char *strstr(const char *haystack, const char *needle); // 文字列 s の中から文字 c を前から検索します。 // 戻り値: 最初に見つかった位置へのポインタ、見つからなければ NULL。 char *strchr(const char *s, int c); // 文字列 s の中から文字 c を後ろから検索します(最後の出現位置を探します)。 char *strrchr(const char *s, int c); // s の中に accept に含まれる任意の文字が最初に現れる位置を返します。 char *strpbrk(const char *s, const char *accept);
関数一覧
| 関数 | 検索対象 | 方向 | 概要 |
|---|---|---|---|
| strstr() | 部分文字列 | 前から | needle が haystack 内に存在すればそのポインタを返します。 |
| strchr() | 1文字 | 前から | 最初に現れる文字の位置を返します。ヌル文字('\0')も検索できます。 |
| strrchr() | 1文字 | 後ろから | 最後に現れる文字の位置を返します。ファイルパスの拡張子取得に使われます。 |
| strpbrk() | 文字集合 | 前から | accept に含まれるいずれかの文字が最初に現れる位置を返します。 |
サンプルコード
#include <stdio.h>
#include <string.h>
int main(void) {
const char *path = "/home/user/documents/report.txt";
// strstr でファイルパスに "documents" が含まれるか確認します。
if (strstr(path, "documents")) {
printf("documents フォルダ内のファイルです。\n");
}
// strchr で最初の '/' の位置を探します。
char *first_slash = strchr(path, '/');
printf("最初の '/' 以降: %s\n", first_slash); // 『/home/user/documents/report.txt』
// strrchr でパスから拡張子を取り出します。
char *ext = strrchr(path, '.');
if (ext) {
printf("拡張子: %s\n", ext); // 『拡張子: .txt』と出力されます。
}
// strrchr でファイル名部分を取り出します。
char *filename = strrchr(path, '/');
if (filename) {
printf("ファイル名: %s\n", filename + 1); // 『report.txt』と出力されます。
}
// strpbrk で区切り文字(スペースかカンマ)の位置を探します。
const char *csv = "apple,banana orange";
char *sep = strpbrk(csv, ", ");
if (sep) {
printf("最初の区切り位置: '%c'\n", *sep); // 『最初の区切り位置: ','』と出力されます。
}
return 0;
}
概要
これらの関数は見つかった位置へのポインタを返します。ポインタを利用して元の文字列の途中から処理を続けられます。戻り値が NULL かどうかを必ず確認してから使用してください。NULL のまま参照すると未定義動作が発生します。
見つかった位置と文字列の先頭アドレスの差を取れば、0始まりのインデックスが計算できます(例:『pos - haystack』)。
文字列のコピーや連結については『strlen() / strcpy()』『strcat()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。