C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で文字列内の特定文字の最後の出現位置(インデックス)を検索する方法

文字列 str と、検索対象となる文字 ch が与えられたとします。この課題では、文字列の中に ch最後に出現する位置(インデックス)を見つける必要があります。

例えば、文字列が「Hello」で、検索する文字が ch = 'l' の場合、'l' はインデックス2と3に出現するため、最後のインデックスは 3 となります。

解決のアプローチ

この問題を解くには、文字列を右から左へ(末尾から先頭へ)順番に走査します。各位置の文字が 'l' と一致しなければインデックスを1つずつ減らしていき、一致する文字が見つかった時点で処理を停止し、そのインデックスを結果として返します。

もし文字列全体を走査しても一致する文字が見つからなかった場合は、-1 を返すことで「文字が存在しない」ことを示します。

サンプルコード

#include<iostream>
using namespace std;

int getLastIndex(string& str, char ch) {
    // 文字列の末尾から先頭に向かって走査する
    for (int i = str.length() - 1; i >= 0; i--)
        if (str[i] == ch)
            return i;   // 一致したらそのインデックスを返す
    return -1;          // 見つからなかった場合
}

int main() {
    string str = "hello";
    char ch = 'l';
    int index = getLastIndex(str, ch);

    if (index == -1)
        cout << "Character not found";   // 文字が見つからない場合
    else
        cout << "Last index is " << index;
}

実行結果

Last index is 3

補足:標準ライブラリを使った別解

C++では、<string> ヘッダーに用意されている rfind() メソッドを使うことで、同様の処理をより簡潔に実現できます。

#include<iostream>
#include<string>
using namespace std;

int main() {
    string str = "hello";
    char ch = 'l';

    size_t index = str.rfind(ch);   // 後方から検索

    if (index == string::npos)
        cout << "Character not found";
    else
        cout << "Last index is " << index;
}

rfind() は文字列の末尾側から検索を行い、最初に一致した位置を返します。文字が見つからない場合は特殊な値 string::npos を返すため、これで判定できます。自前でループを書く必要がないため、実務ではこちらの方法が推奨されます。

  1. C++で括弧文字列からイコールポイント(等分点)を見つける方法

    この記事では、C++を使って括弧の文字列からイコールポイント(等分点)を求める方法を解説します。 イコールポイントとは? イコールポイントとは、あるインデックス i において、その位置より前にある開き括弧「(」の数と、その位置以降にある閉じ括弧「)」の数が等しくなる地点のことです。 例として、次の括弧文字列を考えてみましょう。 (()))( ()()() )) ) → 元の文字列は (()))(()()()))) この文字列を詳しく観察すると、インデックス0〜9の範囲に含まれる開き括弧は5個、インデックス9〜14の範囲に含まれる閉じ括弧も5個あります。したがって、インデックス9がこの文字列の

  2. C++で文字列内の文字の出現頻度を求めるプログラム

    文字列と文字の頻度とは文字列とは、NULL文字(\0)で終端される1次元の文字配列のことです。文字列における「文字の頻度」とは、特定の文字がその文字列の中に何回出現するかを表す数値です。例えば、以下のようになります。文字列: Football is a sport上記の文字列に含まれるアルファベット「o」の頻度は3特定の文字の頻度を求めるプログラム特定のアルファベットの出現回数を求めるプログラムは、以下のとおりです。例#include <iostream>using namespace std;int main() {   char str[100]