この記事では、C言語で文字列の中から特定の文字や文字列を見つける方法について解説します。
具体的には、strstr関数
とstrcasestr関数
の使い方、そしてそれらを使った応用例を紹介します。
これを読むことで、C言語での文字列検索の基本から応用までを理解できるようになります。
初心者の方でもわかりやすいように、サンプルコードとその実行結果を交えて説明しますので、ぜひ参考にしてください。
文字列の検索方法
C言語で文字列を検索する方法はいくつかありますが、ここでは代表的な関数であるstrstr
とstrcasestr
について解説します。
これらの関数を使うことで、特定の文字列を別の文字列の中から簡単に見つけることができます。
strstr関数の使い方
strstrの基本的な使い方
strstr関数
は、ある文字列の中から特定の文字列を検索するための標準ライブラリ関数です。
以下のように使用します。
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, world!";
const char *needle = "world";
char *result;
result = strstr(haystack, needle);
if (result != NULL) {
printf("Found: %s\n", result);
} else {
printf("Not found\n");
}
return 0;
}
この例では、haystack
という文字列の中からneedle
という文字列を検索しています。
strstr関数
は、見つかった場合にはその位置へのポインタを返し、見つからなかった場合にはNULL
を返します。
strstrの戻り値とエラーハンドリング
strstr関数
の戻り値は、検索対象の文字列が見つかった場合にはその位置へのポインタ、見つからなかった場合にはNULL
です。
これを利用してエラーハンドリングを行うことができます。
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, world!";
const char *needle = "planet";
char *result;
result = strstr(haystack, needle);
if (result != NULL) {
printf("Found: %s\n", result);
} else {
printf("Not found\n");
}
return 0;
}
この例では、needle
がhaystack
の中に存在しないため、strstr
はNULL
を返し、 Not found
と表示されます。
strcasestr関数の使い方(POSIX標準)
strcasestrの基本的な使い方
strcasestr関数
は、strstr
と同様に文字列を検索しますが、大文字と小文字を区別しない点が異なります。
この関数はPOSIX標準であり、以下のように使用します。
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, World!";
const char *needle = "world";
char *result;
result = strcasestr(haystack, needle);
if (result != NULL) {
printf("Found: %s\n", result);
} else {
printf("Not found\n");
}
return 0;
}
この例では、haystack
の中にneedle
が大文字小文字を区別せずに存在するため、strcasestr
はその位置へのポインタを返します。
strcasestrの戻り値とエラーハンドリング
strcasestr関数
の戻り値もstrstr
と同様に、検索対象の文字列が見つかった場合にはその位置へのポインタ、見つからなかった場合にはNULL
です。
これを利用してエラーハンドリングを行うことができます。
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, World!";
const char *needle = "planet";
char *result;
result = strcasestr(haystack, needle);
if (result != NULL) {
printf("Found: %s\n", result);
} else {
printf("Not found\n");
}
return 0;
}
この例では、needle
がhaystack
の中に存在しないため、strcasestr
はNULL
を返し、 Not found
と表示されます。
以上が、strstr
とstrcasestr関数
を使った文字列の検索方法の基本的な使い方とエラーハンドリングの方法です。
これらの関数を使うことで、文字列の中から特定の文字列を簡単に見つけることができます。
応用例
文字列内の全ての特定文字を検索
文字列内の特定の文字をすべて検索する場合、strchr関数
を使うことが一般的です。
しかし、strchr関数
は最初に見つかった文字の位置しか返さないため、ループを使って全ての位置を検索する必要があります。
ループを使った検索方法
以下の手順で文字列内の全ての特定文字を検索します。
strchr関数
を使って最初の特定文字の位置を見つける。- 見つかった位置の次の位置から再度
strchr関数
を使って次の特定文字を検索する。 - 文字列の終わりまでこの操作を繰り返す。
実装例
以下に、文字列内の全ての特定文字を検索するC言語のサンプルコードを示します。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "This is a sample string.";
char target = 's';
char *pos = str;
printf("Target character: '%c'\n", target);
printf("String: \"%s\"\n", str);
printf("Positions: ");
while ((pos = strchr(pos, target)) != NULL) {
printf("%ld ", pos - str);
pos++; // 次の位置から検索を続ける
}
printf("\n");
return 0;
}
このプログラムを実行すると、以下のような出力が得られます。
Target character: 's'
String: "This is a sample string."
Positions: 3 6 10 17
この出力から、文字’s’が文字列内の3番目、6番目、10番目、17番目の位置に存在することがわかります。
文字列内の全ての特定文字列を検索
文字列内の特定の文字列をすべて検索する場合、strstr関数
を使うことが一般的です。
しかし、strstr関数
も最初に見つかった文字列の位置しか返さないため、ループを使って全ての位置を検索する必要があります。
ループを使った検索方法
以下の手順で文字列内の全ての特定文字列を検索します。
strstr関数
を使って最初の特定文字列の位置を見つける。- 見つかった位置の次の位置から再度
strstr関数
を使って次の特定文字列を検索する。 - 文字列の終わりまでこの操作を繰り返す。
実装例
以下に、文字列内の全ての特定文字列を検索するC言語のサンプルコードを示します。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "This is a test. This test is simple.";
char target[] = "test";
char *pos = str;
printf("Target string: \"%s\"\n", target);
printf("String: \"%s\"\n", str);
printf("Positions: ");
while ((pos = strstr(pos, target)) != NULL) {
printf("%ld ", pos - str);
pos += strlen(target); // 次の位置から検索を続ける
}
printf("\n");
return 0;
}
このプログラムを実行すると、以下のような出力が得られます。
Target string: "test"
String: "This is a test. This test is simple."
Positions: 10 21
この出力から、文字列test
が文字列内の10番目と21番目の位置に存在することがわかります。
以上のように、strchr
やstrstr関数
を使って文字列内の特定の文字や文字列を検索する方法を理解することで、C言語での文字列操作がより効率的に行えるようになります。