[C言語] 文字列を検索して最初に現れる位置を取得する方法
C言語で文字列内の特定の文字列を検索し、その最初の出現位置を取得するには、標準ライブラリの関数であるstrstrを使用します。
strstr関数は、指定した文字列の中から検索対象の文字列を探し、最初に見つかった位置のポインタを返します。
見つからない場合はNULLを返すため、結果を確認する際にはNULLチェックが必要です。
この方法を用いることで、効率的に文字列内の特定の部分を見つけることができます。
文字列検索の方法
C言語で文字列を検索する方法には、標準ライブラリを利用する方法と、手動で実装する方法があります。
それぞれの方法について詳しく解説します。
標準ライブラリを使った検索
標準ライブラリを使うことで、効率的に文字列を検索することができます。
ここでは、strstr関数とstrchr関数を紹介します。
strstr関数の使い方
strstr関数は、文字列の中から特定の部分文字列を検索し、その最初の出現位置を返します。
以下に基本的な使い方を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "これはC言語の文字列検索の例です";
    // 検索する部分文字列
    char needle[] = "文字列";
    // strstr関数を使って検索
    char *result = strstr(haystack, needle);
    if (result != NULL) {
        printf("部分文字列が見つかりました: %s\n", result);
    } else {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 文字列検索の例ですこの例では、strstr関数を使って「文字列」という部分文字列を検索し、最初に見つかった位置からの文字列を出力しています。
strchr関数の使い方
strchr関数は、文字列の中から特定の文字を検索し、その最初の出現位置を返します。
以下に基本的な使い方を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "C言語で文字を検索します";
    // 検索する文字
    char ch = '文';
    // strchr関数を使って検索
    char *result = strchr(str, ch);
    if (result != NULL) {
        printf("文字が見つかりました: %s\n", result);
    } else {
        printf("文字は見つかりませんでした。\n");
    }
    return 0;
}文字が見つかりました: 文字を検索しますこの例では、strchr関数を使って「文」という文字を検索し、最初に見つかった位置からの文字列を出力しています。
手動での文字列検索
標準ライブラリを使わずに、手動で文字列を検索する方法もあります。
ここでは、ループを使った方法とポインタを使った方法を紹介します。
ループを使った検索方法
ループを使って文字列を1文字ずつ比較することで、特定の文字列を検索することができます。
以下に基本的な実装例を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "C言語で文字列を検索する例";
    // 検索する部分文字列
    char needle[] = "文字列";
    int haystack_len = strlen(haystack);
    int needle_len = strlen(needle);
    int found = 0;
    // ループを使って検索
    for (int i = 0; i <= haystack_len - needle_len; i++) {
        if (strncmp(&haystack[i], needle, needle_len) == 0) {
            printf("部分文字列が見つかりました: %s\n", &haystack[i]);
            found = 1;
            break;
        }
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 文字列を検索する例この例では、strncmp関数を使って、文字列を1文字ずつ比較しながら検索しています。
ポインタを使った検索方法
ポインタを使うことで、より効率的に文字列を検索することができます。
以下に基本的な実装例を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "C言語でポインタを使って検索";
    // 検索する部分文字列
    char needle[] = "ポインタ";
    char *p = haystack;
    int needle_len = strlen(needle);
    int found = 0;
    // ポインタを使って検索
    while (*p != '#include <stdio.h>
#include <string.h>
int main() {
// 検索対象の文字列
char haystack[] = "C言語でポインタを使って検索";
// 検索する部分文字列
char needle[] = "ポインタ";
char *p = haystack;
int needle_len = strlen(needle);
int found = 0;
// ポインタを使って検索
while (*p != '\0') {
if (strncmp(p, needle, needle_len) == 0) {
printf("部分文字列が見つかりました: %s\n", p);
found = 1;
break;
}
p++;
}
if (!found) {
printf("部分文字列は見つかりませんでした。\n");
}
return 0;
}
') {
        if (strncmp(p, needle, needle_len) == 0) {
            printf("部分文字列が見つかりました: %s\n", p);
            found = 1;
            break;
        }
        p++;
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: ポインタを使って検索この例では、ポインタを使って文字列を1文字ずつ進めながら、strncmp関数で比較を行っています。
ポインタを使うことで、コードがより効率的かつ簡潔になります。
手動での文字列検索の実装
手動で文字列を検索する方法は、標準ライブラリを使わずに自分でアルゴリズムを実装することです。
これにより、より柔軟な検索が可能になります。
ここでは、ループを使った方法とポインタを使った方法を詳しく解説します。
ループを使った実装方法
ループを使った実装方法では、文字列を1文字ずつ比較していくことで、特定の文字列を検索します。
文字列の長さを取得する
文字列の長さを取得することは、ループを使った検索の基本です。
strlen関数を使って文字列の長さを取得します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "C言語で文字列の長さを取得する";
    // 文字列の長さを取得
    int length = strlen(str);
    printf("文字列の長さは: %d\n", length);
    return 0;
}文字列の長さは: 18この例では、strlen関数を使って文字列の長さを取得し、出力しています。
文字列を1文字ずつ比較する
文字列を1文字ずつ比較することで、特定の文字列を検索します。
以下に基本的な実装例を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "C言語で文字列を1文字ずつ比較する";
    // 検索する部分文字列
    char needle[] = "文字列";
    int haystack_len = strlen(haystack);
    int needle_len = strlen(needle);
    int found = 0;
    // ループを使って1文字ずつ比較
    for (int i = 0; i <= haystack_len - needle_len; i++) {
        int j;
        for (j = 0; j < needle_len; j++) {
            if (haystack[i + j] != needle[j]) {
                break;
            }
        }
        if (j == needle_len) {
            printf("部分文字列が見つかりました: %s\n", &haystack[i]);
            found = 1;
            break;
        }
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 文字列を1文字ずつ比較するこの例では、2重ループを使って文字列を1文字ずつ比較し、部分文字列を検索しています。
ポインタを使った実装方法
ポインタを使った実装方法では、ポインタを使って文字列を操作し、効率的に検索を行います。
ポインタの基本操作
ポインタを使うことで、文字列の各文字に直接アクセスできます。
以下にポインタの基本操作を示します。
#include <stdio.h>
int main() {
    // 文字列
    char str[] = "ポインタの基本操作";
    // ポインタを使って文字列を操作
    char *p = str;
    while (*p != '#include <stdio.h>
int main() {
// 文字列
char str[] = "ポインタの基本操作";
// ポインタを使って文字列を操作
char *p = str;
while (*p != '\0') {
printf("%c ", *p);
p++;
}
printf("\n");
return 0;
}
') {
        printf("%c ", *p);
        p++;
    }
    printf("\n");
    return 0;
}ポ イ ン タ の 基 本 操 作 この例では、ポインタを使って文字列の各文字にアクセスし、1文字ずつ出力しています。
ポインタを使った文字列比較
ポインタを使って文字列を比較することで、効率的に部分文字列を検索できます。
以下に基本的な実装例を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "ポインタを使って文字列を比較する";
    // 検索する部分文字列
    char needle[] = "文字列";
    char *p = haystack;
    int needle_len = strlen(needle);
    int found = 0;
    // ポインタを使って文字列を比較
    while (*p != '#include <stdio.h>
#include <string.h>
int main() {
// 検索対象の文字列
char haystack[] = "ポインタを使って文字列を比較する";
// 検索する部分文字列
char needle[] = "文字列";
char *p = haystack;
int needle_len = strlen(needle);
int found = 0;
// ポインタを使って文字列を比較
while (*p != '\0') {
if (strncmp(p, needle, needle_len) == 0) {
printf("部分文字列が見つかりました: %s\n", p);
found = 1;
break;
}
p++;
}
if (!found) {
printf("部分文字列は見つかりませんでした。\n");
}
return 0;
}
') {
        if (strncmp(p, needle, needle_len) == 0) {
            printf("部分文字列が見つかりました: %s\n", p);
            found = 1;
            break;
        }
        p++;
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 文字列を比較するこの例では、ポインタを使って文字列を1文字ずつ進めながら、strncmp関数で比較を行い、部分文字列を検索しています。
ポインタを使うことで、コードがより効率的かつ簡潔になります。
応用例
文字列検索の基本を理解したら、応用的な検索方法を試してみましょう。
ここでは、大文字小文字を区別しない検索、部分一致検索、複数の文字列を同時に検索する方法を紹介します。
大文字小文字を区別しない検索
大文字小文字を区別しない検索を行うには、文字列を比較する際に大文字と小文字を同一視する必要があります。
以下にその実装例を示します。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 大文字小文字を区別しない比較関数
int strcasecmp_custom(const char *s1, const char *s2) {
    while (*s1 && *s2) {
        if (tolower((unsigned char)*s1) != tolower((unsigned char)*s2)) {
            return tolower((unsigned char)*s1) - tolower((unsigned char)*s2);
        }
        s1++;
        s2++;
    }
    return tolower((unsigned char)*s1) - tolower((unsigned char)*s2);
}
int main() {
    // 検索対象の文字列
    char haystack[] = "C言語で大文字小文字を区別しない検索";
    // 検索する部分文字列
    char needle[] = "大文字小文字";
    char *p = haystack;
    int needle_len = strlen(needle);
    int found = 0;
    // ポインタを使って大文字小文字を区別しない検索
    while (*p != '#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 大文字小文字を区別しない比較関数
int strcasecmp_custom(const char *s1, const char *s2) {
while (*s1 && *s2) {
if (tolower((unsigned char)*s1) != tolower((unsigned char)*s2)) {
return tolower((unsigned char)*s1) - tolower((unsigned char)*s2);
}
s1++;
s2++;
}
return tolower((unsigned char)*s1) - tolower((unsigned char)*s2);
}
int main() {
// 検索対象の文字列
char haystack[] = "C言語で大文字小文字を区別しない検索";
// 検索する部分文字列
char needle[] = "大文字小文字";
char *p = haystack;
int needle_len = strlen(needle);
int found = 0;
// ポインタを使って大文字小文字を区別しない検索
while (*p != '\0') {
if (strcasecmp_custom(p, needle) == 0) {
printf("部分文字列が見つかりました: %s\n", p);
found = 1;
break;
}
p++;
}
if (!found) {
printf("部分文字列は見つかりませんでした。\n");
}
return 0;
}
') {
        if (strcasecmp_custom(p, needle) == 0) {
            printf("部分文字列が見つかりました: %s\n", p);
            found = 1;
            break;
        }
        p++;
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 大文字小文字を区別しない検索この例では、tolower関数を使って文字を小文字に変換しながら比較を行うことで、大文字小文字を区別しない検索を実現しています。
部分一致検索の実装
部分一致検索では、文字列の一部が一致するかどうかを確認します。
以下にその実装例を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "C言語で部分一致検索を実装する";
    // 検索する部分文字列
    char needle[] = "部分一致";
    int haystack_len = strlen(haystack);
    int needle_len = strlen(needle);
    int found = 0;
    // ループを使って部分一致検索
    for (int i = 0; i <= haystack_len - needle_len; i++) {
        if (strncmp(&haystack[i], needle, needle_len) == 0) {
            printf("部分文字列が見つかりました: %s\n", &haystack[i]);
            found = 1;
            break;
        }
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 部分一致検索を実装するこの例では、strncmp関数を使って部分文字列が一致するかどうかを確認し、部分一致検索を行っています。
複数の文字列を同時に検索する方法
複数の文字列を同時に検索するには、検索する文字列を配列に格納し、各文字列を順番に検索します。
以下にその実装例を示します。
#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char haystack[] = "C言語で複数の文字列を同時に検索する";
    // 検索する部分文字列の配列
    char *needles[] = {"複数", "文字列", "検索"};
    int num_needles = sizeof(needles) / sizeof(needles[0]);
    int haystack_len = strlen(haystack);
    int found = 0;
    // 各部分文字列を順番に検索
    for (int n = 0; n < num_needles; n++) {
        char *needle = needles[n];
        int needle_len = strlen(needle);
        for (int i = 0; i <= haystack_len - needle_len; i++) {
            if (strncmp(&haystack[i], needle, needle_len) == 0) {
                printf("部分文字列が見つかりました: %s\n", &haystack[i]);
                found = 1;
                break;
            }
        }
    }
    if (!found) {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}部分文字列が見つかりました: 複数の文字列を同時に検索する
部分文字列が見つかりました: 文字列を同時に検索する
部分文字列が見つかりました: 検索するこの例では、検索する文字列を配列に格納し、各文字列を順番に検索することで、複数の文字列を同時に検索しています。
まとめ
文字列検索はC言語でよく使われる操作であり、標準ライブラリや手動実装を通じて様々な方法で実現できます。
この記事では、strstrやstrchrを使った基本的な検索方法から、手動での実装、応用的な検索方法までを解説しました。
これらの知識を活用して、より効率的で柔軟な文字列操作を行ってみてください。
 
![[C言語] atol関数の使い方 – 文字列をlong型数値に変換する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47138.png)
![[C言語] atof関数の使い方 – 文字列を浮動小数(double)に変換する方法](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47137.png)
![[C言語] sprintf関数の使い方 – 複数の変数を文字列にフォーマット](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47139.png)
![[C言語] sscanf関数の使い方 – フォーマット指定でファイルから読み込む](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47140.png)
![[C言語] strcat 使い方 – 文字列の連結](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47141.png)
![[C言語] strcpy関数の使い方 – 文字列をコピーする](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47144.png)
![[C言語] strcmp関数の使い方 – 文字列を比較する](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47143.png)
![[C言語] strchr関数の使い方 – 最初に見つかった文字の位置を取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47142.png)
![[C言語] strncat関数の使い方 – 指定文字分結合](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47148.png)
![[C言語] strlen関数の使い方 – 文字列の長さ(バイト数)の取得](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47147.png)
![[C言語] stricmp関数の使い方 – 大文字小文字を区別しない比較](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47146.png)
![[C言語] strcspn関数の使い方 – 文字群が含まれる位置を検索](https://af-e.net/wp-content/uploads/2024/10/thumbnail-47145.png)