[C言語] 指定した文字列が何文字目にあるのか検索する方法

C言語で指定した文字列内の特定の文字が何文字目にあるかを検索するには、標準ライブラリの関数であるstrchrを使用します。

strchrは、文字列の中から指定した文字を最初に見つけた位置を指すポインタを返します。

このポインタを文字列の先頭からの距離を計算することで、文字が何文字目にあるかを知ることができます。

見つからない場合はNULLが返されるため、エラーチェックも可能です。

この記事でわかること
  • strchr、strstr、strrchr、strpbrk関数の使い方
  • ループやポインタを使った手動での文字列検索方法
  • 大文字と小文字を区別しない検索の実装方法
  • 部分一致検索や複数文字列の同時検索の方法

目次から探す

標準ライブラリを使った文字列検索

C言語の標準ライブラリには、文字列を検索するための便利な関数がいくつか用意されています。

これらの関数を使うことで、文字列内の特定の文字や部分文字列を簡単に見つけることができます。

以下では、代表的な関数であるstrchrstrstrstrrchrstrpbrkの使い方について解説します。

strchr関数の使い方

strchr関数は、指定した文字が文字列の中で最初に現れる位置を検索します。

見つかった場合、その位置へのポインタを返します。

#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字
    char ch = 'o';
    
    // strchr関数を使って文字を検索
    char *pos = strchr(str, ch);
    
    if (pos != NULL) {
        printf("文字 '%c' は %ld 番目にあります。\n", ch, pos - str + 1);
    } else {
        printf("文字 '%c' は見つかりませんでした。\n", ch);
    }
    
    return 0;
}
文字 'o' は 5 番目にあります。

この例では、文字列 “Hello, World!” の中で ‘o’ が最初に現れる位置を検索し、その位置を表示しています。

strstr関数の使い方

strstr関数は、指定した部分文字列が文字列の中で最初に現れる位置を検索します。

見つかった場合、その位置へのポインタを返します。

#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する部分文字列
    char substr[] = "World";
    
    // strstr関数を使って部分文字列を検索
    char *pos = strstr(str, substr);
    
    if (pos != NULL) {
        printf("部分文字列 \"%s\" は %ld 番目にあります。\n", substr, pos - str + 1);
    } else {
        printf("部分文字列 \"%s\" は見つかりませんでした。\n", substr);
    }
    
    return 0;
}
部分文字列 "World" は 8 番目にあります。

この例では、文字列 “Hello, World!” の中で “World” が最初に現れる位置を検索し、その位置を表示しています。

strrchr関数の使い方

strrchr関数は、指定した文字が文字列の中で最後に現れる位置を検索します。

見つかった場合、その位置へのポインタを返します。

#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字
    char ch = 'o';
    
    // strrchr関数を使って文字を検索
    char *pos = strrchr(str, ch);
    
    if (pos != NULL) {
        printf("文字 '%c' は最後に %ld 番目にあります。\n", ch, pos - str + 1);
    } else {
        printf("文字 '%c' は見つかりませんでした。\n", ch);
    }
    
    return 0;
}
文字 'o' は最後に 9 番目にあります。

この例では、文字列 “Hello, World!” の中で ‘o’ が最後に現れる位置を検索し、その位置を表示しています。

strpbrk関数の使い方

strpbrk関数は、指定した文字集合のいずれかの文字が文字列の中で最初に現れる位置を検索します。

見つかった場合、その位置へのポインタを返します。

#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字集合
    char charset[] = "aeiou";
    
    // strpbrk関数を使って文字を検索
    char *pos = strpbrk(str, charset);
    
    if (pos != NULL) {
        printf("文字集合 \"%s\" のいずれかの文字は %ld 番目にあります。\n", charset, pos - str + 1);
    } else {
        printf("文字集合 \"%s\" のいずれの文字も見つかりませんでした。\n", charset);
    }
    
    return 0;
}
文字集合 "aeiou" のいずれかの文字は 2 番目にあります。

この例では、文字列 “Hello, World!” の中で母音のいずれかが最初に現れる位置を検索し、その位置を表示しています。

手動で文字列を検索する方法

C言語の標準ライブラリを使わずに、手動で文字列を検索する方法もあります。

これにより、より柔軟な検索ロジックを実装することが可能です。

以下では、ループ、ポインタ、インデックスを使った文字列検索の方法について解説します。

ループを使った文字列検索

ループを使って文字列を1文字ずつ調べることで、特定の文字を検索することができます。

#include <stdio.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字
    char ch = 'o';
    int i;
    int found = 0;
    
    // ループを使って文字を検索
    for (i = 0; str[i] != '\0'; i++) {
        if (str[i] == ch) {
            printf("文字 '%c' は %d 番目にあります。\n", ch, i + 1);
            found = 1;
            break;
        }
    }
    
    if (!found) {
        printf("文字 '%c' は見つかりませんでした。\n", ch);
    }
    
    return 0;
}
文字 'o' は 5 番目にあります。

この例では、文字列 “Hello, World!” をループで1文字ずつ調べ、’o’ が最初に現れる位置を表示しています。

ポインタを使った文字列検索

ポインタを使うことで、文字列を直接操作しながら検索を行うことができます。

#include <stdio.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字
    char ch = 'o';
    char *ptr = str;
    int found = 0;
    
    // ポインタを使って文字を検索
    while (*ptr != '\0') {
        if (*ptr == ch) {
            printf("文字 '%c' は %ld 番目にあります。\n", ch, ptr - str + 1);
            found = 1;
            break;
        }
        ptr++;
    }
    
    if (!found) {
        printf("文字 '%c' は見つかりませんでした。\n", ch);
    }
    
    return 0;
}
文字 'o' は 5 番目にあります。

この例では、ポインタを使って文字列を1文字ずつ調べ、’o’ が最初に現れる位置を表示しています。

インデックスを使った文字列検索

インデックスを使って文字列を検索する方法は、ループを使った方法と似ていますが、インデックスを明示的に操作することで検索を行います。

#include <stdio.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字
    char ch = 'o';
    int index = 0;
    int found = 0;
    
    // インデックスを使って文字を検索
    while (str[index] != '\0') {
        if (str[index] == ch) {
            printf("文字 '%c' は %d 番目にあります。\n", ch, index + 1);
            found = 1;
            break;
        }
        index++;
    }
    
    if (!found) {
        printf("文字 '%c' は見つかりませんでした。\n", ch);
    }
    
    return 0;
}
文字 'o' は 5 番目にあります。

この例では、インデックスを使って文字列を1文字ずつ調べ、’o’ が最初に現れる位置を表示しています。

応用例

文字列検索の基本を理解したら、次は応用的な検索方法を学びましょう。

ここでは、大文字と小文字を区別しない検索、部分一致検索、複数の文字列を同時に検索する方法について解説します。

大文字と小文字を区別しない検索

大文字と小文字を区別せずに文字列を検索するには、文字列をすべて小文字または大文字に変換してから検索を行います。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 文字列を小文字に変換する関数
void toLowerCase(char *str) {
    while (*str) {
        *str = tolower(*str);
        str++;
    }
}
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する文字
    char ch = 'O';
    char lowerStr[50];
    
    // 文字列を小文字に変換
    strcpy(lowerStr, str);
    toLowerCase(lowerStr);
    
    // 小文字に変換した文字列で検索
    char *pos = strchr(lowerStr, tolower(ch));
    
    if (pos != NULL) {
        printf("文字 '%c' は %ld 番目にあります。\n", ch, pos - lowerStr + 1);
    } else {
        printf("文字 '%c' は見つかりませんでした。\n", ch);
    }
    
    return 0;
}
文字 'O' は 5 番目にあります。

この例では、文字列 “Hello, World!” を小文字に変換してから ‘O’ を検索し、その位置を表示しています。

部分一致検索の実装

部分一致検索では、文字列の一部が一致するかどうかを調べます。

strstr関数を使うことで簡単に実装できます。

#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する部分文字列
    char substr[] = "lo, Wo";
    
    // 部分一致検索
    char *pos = strstr(str, substr);
    
    if (pos != NULL) {
        printf("部分文字列 \"%s\" は %ld 番目にあります。\n", substr, pos - str + 1);
    } else {
        printf("部分文字列 \"%s\" は見つかりませんでした。\n", substr);
    }
    
    return 0;
}
部分文字列 "lo, Wo" は 4 番目にあります。

この例では、文字列 “Hello, World!” の中で “lo, Wo” が最初に現れる位置を検索し、その位置を表示しています。

複数の文字列を同時に検索する方法

複数の文字列を同時に検索するには、各文字列に対して検索を行い、最初に見つかった位置を記録します。

#include <stdio.h>
#include <string.h>
int main() {
    // 検索対象の文字列
    char str[] = "Hello, World!";
    // 検索する部分文字列の配列
    char *substrings[] = {"World", "Hello", "!"};
    int numSubstrings = sizeof(substrings) / sizeof(substrings[0]);
    int i;
    char *pos;
    int found = 0;
    
    // 複数の部分文字列を検索
    for (i = 0; i < numSubstrings; i++) {
        pos = strstr(str, substrings[i]);
        if (pos != NULL) {
            printf("部分文字列 \"%s\" は %ld 番目にあります。\n", substrings[i], pos - str + 1);
            found = 1;
        }
    }
    
    if (!found) {
        printf("いずれの部分文字列も見つかりませんでした。\n");
    }
    
    return 0;
}
部分文字列 "World" は 8 番目にあります。
部分文字列 "Hello" は 1 番目にあります。
部分文字列 "!" は 13 番目にあります。

この例では、文字列 “Hello, World!” の中で “World”、”Hello”、”!” の各部分文字列を検索し、それぞれの位置を表示しています。

よくある質問

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

strchrstrstrはどちらも文字列検索に使われる関数ですが、目的が異なります。

  • strchrは、指定した文字が文字列の中で最初に現れる位置を検索します。

例:char *pos = strchr(str, 'a');

  • strstrは、指定した部分文字列が文字列の中で最初に現れる位置を検索します。

例:char *pos = strstr(str, "abc");

つまり、strchrは単一の文字を検索するのに対し、strstrは部分文字列を検索するために使用されます。

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

文字列が見つからない場合、strchrstrstrNULLを返します。

これにより、検索結果が存在しないことを確認できます。

例えば、if (pos == NULL)のように条件分岐を使って、見つからなかった場合の処理を行うことができます。

マルチバイト文字列の検索はどうすればいいですか?

マルチバイト文字列を検索する場合、標準の文字列関数ではなく、マルチバイト文字列に対応した関数を使用する必要があります。

例えば、wchar_t型を使ったワイド文字列を扱う場合は、wcschrwcsstrなどのワイド文字列関数を使用します。

これにより、マルチバイト文字列の正確な検索が可能になります。

まとめ

文字列検索はC言語プログラミングにおいて基本的かつ重要な操作です。

標準ライブラリの関数を使うことで、効率的に文字列内の特定の文字や部分文字列を見つけることができます。

この記事を通じて、文字列検索の基本から応用までを理解し、実際のプログラミングに役立ててください。

新たに学んだ知識を活用し、より複雑な文字列操作に挑戦してみましょう。

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

関連カテゴリーから探す

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