文字列の後ろの方から文字を探す | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

文字列の中から、任意の文字を探したいとします。ただし、文字列の末尾に近いものを探すという条件があるとしましょう。

先頭に近いものを探す方法は、「逆引き 文字列から文字を探す」で取り上げています。

たとえば、“abcdabcd” から ‘c’ を探す場合、‘c’ は2つありますが、後ろから2文字目のところにある ‘c’ のほうを見つけてほしいということです。

この要求はつまり、ある文字が含まれているかどうかだけではなく、どこにあるかも重要だということでもあります。したがって、bool型の結果を返すのではなく、見つかった文字を指すポインタを返すように考えます。添字が必要なら、ポインタの減算(第32章)で対応できます。

/*
    文字列の後ろの方から文字を探す。

    引数
        s: 対象の文字列
        c: 探す文字
    戻り値
        見つかったらその文字のメモリアドレス。
        見つからなかったらヌルポインタ。
*/
char* find_last_char(const char* s, char c);


int main(void)
{
    const char s[] = "abcdabcd";

    // 最後に現れる位置を調べる
    char* p = find_last_char(s, 'c');

    // 何文字目にあったか
    if (p != NULL) {
        ptrdiff_t index = p - s;
    }
}

方法①(strrchr関数を使う)

標準ライブラリには、この目的に合った strrchr関数があります。strrchr関数は、string.h で宣言されています。

実のところ、これを使うだけですべて解決します。冒頭で、find_last_char関数にまとめるような感じで考えましたが、strrchr関数をそのまま使うのでも問題ありません。自作の関数でラップするのなら、インライン関数(第57章)にして高速化を図るといいでしょう。

#include <stdio.h>
#include <string.h>

/*
    文字列の後ろの方から文字を探す。

    引数
        s: 対象の文字列
        c: 探す文字
    戻り値
        見つかったらその文字のメモリアドレス。
        見つからなかったらヌルポインタ。
*/
inline char* find_last_char(const char* s, char c)
{
    return strrchr(s, c);
}


int main(void)
{
    const char s[] = "abcdabcd";

    char* p = find_last_char(s, 'c');
    if (p == NULL) {
        puts("not found");
    }
    else {
        printf("found. (%td)\n", p - s);
    }
}

実行結果:

found. (6)


参考リンク


更新履歴



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る