【C言語】後ろから文字列を検索する方法を解説

この記事では、C言語の標準ライブラリを使った方法と、自作関数を使った方法の両方を解説します。

さらに、実際の応用例として、ファイルパスからファイル名を抽出する方法や、URLからドメインを抽出する方法も紹介します。

初心者の方でも理解しやすいように、サンプルコードとその実行結果を交えて説明しますので、ぜひ最後までご覧ください。

目次から探す

後ろから文字列を検索する方法

C言語で文字列を操作する際、特定の文字を後ろから検索したい場合があります。

例えば、ファイルパスからファイル名を抽出する場合や、URLからドメインを抽出する場合などです。

この記事では、標準ライブラリを使った方法と、自作関数での実装方法について解説します。

標準ライブラリを使った方法

C言語の標準ライブラリには、文字列操作に便利な関数が多数用意されています。

その中でも、後ろから文字列を検索するための関数として strrchr関数があります。

strrchr 関数の使い方

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

以下は strrchr関数の基本的な使い方です。

#include <stdio.h>
#include <string.h>
char *strrchr(const char *str, int c);
  • str: 検索対象の文字列
  • c: 検索する文字

この関数は、文字 c が文字列 str の中で最後に現れる位置へのポインタを返します。

もし文字 c が見つからなかった場合は、NULL を返します。

strrchr 関数の例

以下に、strrchr関数を使った具体的な例を示します。

#include <stdio.h>
#include <string.h>
int main() {
    const char *str = "Hello, world!";
    char ch = 'o';
    char *result = strrchr(str, ch);
    if (result != NULL) {
        printf("文字 '%c' は文字列 \"%s\" の中で最後に現れる位置は: %ld\n", ch, str, result - str);
    } else {
        printf("文字 '%c' は文字列 \"%s\" の中に見つかりませんでした。\n", ch, str);
    }
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

文字 'o' は文字列 "Hello, world!" の中で最後に現れる位置は: 8

自作関数での実装

標準ライブラリの関数を使わずに、自分で後ろから文字列を検索する関数を実装することもできます。

ここでは、自作関数の設計と実装方法について解説します。

自作関数の設計

自作関数を設計する際には、以下の点を考慮します。

  1. 入力として文字列と検索する文字を受け取る。
  2. 文字列の末尾から先頭に向かって検索を行う。
  3. 検索する文字が見つかった場合、その位置へのポインタを返す。
  4. 見つからなかった場合は、NULL を返す。

自作関数の実装例

以下に、自作関数 my_strrchr の実装例を示します。

#include <stdio.h>
char *my_strrchr(const char *str, int c) {
    const char *last_occurrence = NULL;
    while (*str != '\0') {
        if (*str == c) {
            last_occurrence = str;
        }
        str++;
    }
    return (char *)last_occurrence;
}

この関数は、文字列 str の中で文字 c が最後に現れる位置へのポインタを返します。

自作関数のテスト

自作関数 my_strrchr をテストするためのプログラムを以下に示します。

#include <stdio.h>
char *my_strrchr(const char *str, int c);
int main() {
    const char *str = "Hello, world!";
    char ch = 'o';
    char *result = my_strrchr(str, ch);
    if (result != NULL) {
        printf("文字 '%c' は文字列 \"%s\" の中で最後に現れる位置は: %ld\n", ch, str, result - str);
    } else {
        printf("文字 '%c' は文字列 \"%s\" の中に見つかりませんでした。\n", ch, str);
    }
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

文字 'o' は文字列 "Hello, world!" の中で最後に現れる位置は: 8

このようにして、自作関数でも標準ライブラリの strrchr関数と同様の機能を実現することができます。

応用例

ファイルパスからファイル名を抽出する

C言語でファイルパスからファイル名を抽出するには、strrchr関数を利用するのが一般的です。

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

これを利用して、ファイルパスの最後のスラッシュ(/)を見つけ、その位置からファイル名を抽出します。

以下に、具体的な例を示します。

#include <stdio.h>
#include <string.h>
int main() {
    char path[] = "/home/user/documents/report.txt";
    char *filename;
    // 最後のスラッシュを検索
    filename = strrchr(path, '/');
    
    // スラッシュが見つかった場合、その次の文字がファイル名
    if (filename != NULL) {
        filename++; // スラッシュの次の文字にポインタを移動
    } else {
        // スラッシュが見つからなかった場合、全体がファイル名
        filename = path;
    }
    printf("ファイル名: %s\n", filename);
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

ファイル名: report.txt

このようにして、ファイルパスからファイル名を簡単に抽出することができます。

URLからドメインを抽出する

次に、URLからドメインを抽出する方法を見てみましょう。

URLの形式は一般的に http://www.example.com/path/to/resource のようになっています。

この場合、// の後に続く部分がドメイン名となります。

以下に、具体的な例を示します。

#include <stdio.h>
#include <string.h>
int main() {
    char url[] = "http://www.example.com/path/to/resource";
    char *domain;
    char *start;
    // "://" を検索
    start = strstr(url, "://");
    
    // "://" が見つかった場合、その次の文字からドメイン名が始まる
    if (start != NULL) {
        start += 3; // "://" の次の文字にポインタを移動
    } else {
        // "://" が見つからなかった場合、全体がドメイン名
        start = url;
    }
    // ドメイン名の終わりを検索
    domain = strchr(start, '/');
    
    // スラッシュが見つかった場合、そこまでがドメイン名
    if (domain != NULL) {
        *domain = '\0'; // スラッシュを終端文字に置き換える
    }
    printf("ドメイン名: %s\n", start);
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

ドメイン名: www.example.com

このようにして、URLからドメイン名を抽出することができます。

これらの応用例を通じて、strrchr関数やその他の文字列操作関数を使って、さまざまな文字列操作を行う方法を学ぶことができます。

これらのテクニックは、ファイル操作やネットワークプログラミングなど、実際のプログラミングにおいて非常に役立ちます。

目次から探す