C 言語で文字列にサブストリングが含まれているかどうかをチェックする
胡金庫
2023年10月12日
-
文字列が C 言語で部分文字列を含むかどうかを調べるには
strstrstr
関数を使用する -
文字列が部分文字列を含むかどうかを調べるには、
strcasestr
関数を用いる -
関数
strncpy
を用いて部分文字列をコピーする
この記事では、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
著者: 胡金庫