[C言語] 文字列を検索して最初に現れる位置を取得する方法

C言語で文字列内の特定の文字列を検索し、その最初の出現位置を取得するには、標準ライブラリの関数であるstrstrを使用します。

strstr関数は、指定した文字列の中から検索対象の文字列を探し、最初に見つかった位置のポインタを返します。

見つからない場合はNULLを返すため、結果を確認する際にはNULLチェックが必要です。

この方法を用いることで、効率的に文字列内の特定の部分を見つけることができます。

この記事でわかること
  • strstrとstrchrを使った文字列検索の基本
  • ループやポインタを使った手動での文字列検索の実装方法
  • 大文字小文字を区別しない検索や部分一致検索の実装
  • 複数の文字列を同時に検索する方法
  • 文字列検索のパフォーマンス向上のためのヒント

目次から探す

文字列検索の方法

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;
}
部分文字列が見つかりました: 複数の文字列を同時に検索する
部分文字列が見つかりました: 文字列を同時に検索する
部分文字列が見つかりました: 検索する

この例では、検索する文字列を配列に格納し、各文字列を順番に検索することで、複数の文字列を同時に検索しています。

よくある質問

strstrとstrchrの違いは何ですか?

strstrstrchrはどちらもC言語の標準ライブラリで提供される文字列検索関数ですが、用途が異なります。

  • strstrは、文字列の中から特定の部分文字列を検索し、その最初の出現位置を返します。

例:char *result = strstr(haystack, needle);

  • strchrは、文字列の中から特定の文字を検索し、その最初の出現位置を返します。

例:char *result = strchr(str, ch);

文字列が見つからない場合、どうなりますか?

文字列が見つからない場合、strstrstrchrはどちらもNULLを返します。

これにより、検索結果が見つからなかったことを確認できます。

例:if (result == NULL) { printf("文字列は見つかりませんでした。\n"); }

文字列検索のパフォーマンスを向上させる方法はありますか?

文字列検索のパフォーマンスを向上させるための方法はいくつかあります。

  • 効率的なアルゴリズムを使用する: より効率的な検索アルゴリズム(例:KMP法やBoyer-Moore法)を実装することで、検索速度を向上させることができます。
  • 文字列の長さを事前に確認する: 検索対象の文字列が短い場合、検索を早期に終了することができます。
  • ポインタを使用する: ポインタを使って文字列を操作することで、ループのオーバーヘッドを減らし、パフォーマンスを向上させることができます。

まとめ

文字列検索はC言語でよく使われる操作であり、標準ライブラリや手動実装を通じて様々な方法で実現できます。

この記事では、strstrstrchrを使った基本的な検索方法から、手動での実装、応用的な検索方法までを解説しました。

これらの知識を活用して、より効率的で柔軟な文字列操作を行ってみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す