stringのfind関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DOG
記事: 27
登録日時: 6年前

stringのfind関数について

#1

投稿記事 by DOG » 6年前

stringクラスのfind関数を使ってプログラムを書こうと思っています。
プログラムの内容というのは、string型の文字列 "takeshikita"から'a'という文字が何番目に並んでいるかというのを求めたいというものです。
この例でしたら、正解は2番目と11番目ですよね。
ここで、以下のプログラムを見てください。

コード:

#include <iostream>
#include <string>

using namespace std;

int main(int argc, char **argv){
        int n;
	string str;

	str = "takeshikita";

	while ((n = str.find("a")) != str.npos){
		cout << n << endl;
	}

	return 0;
}
これだと、実行結果が永遠に'1'と出力されたまま終わりません。
確かに、このままだと2番目の'a'だけが無限ループで検出されるだけです。
ですので、2番目の'a'が検出されたら次の'a'が検出されるようにしたいのですが、find関数を使ってそのようなことは可能でしょうか?
それと、文字列の最後尾にきたら検出操作を停止させたいのですが、それはwhileの条件式
(n = str.find("a")) != str.npos
で合っていますでしょうか?
どなたかご教授下さいませ。

かずま

Re: stringのfind関数について

#2

投稿記事 by かずま » 6年前

DOG さんが書きました:この例でしたら、正解は2番目と11番目ですよね。
0 から始まるので、1 と 10 です。
DOG さんが書きました:find関数を使ってそのようなことは可能でしょうか?
c++ string find で検索してみてください。

コード:

#include <iostream>
#include <string>
 
int main(int argc, char *argv[])
{
    using namespace std;
    string str = "takeshikita";
    for (string::size_type n = 0; (n = str.find('a', n)) != string::npos; n++)
        cout << n << endl;
    return 0;
}
string::size_type は、int でも unsigned でもかまいません。
find() の第1引数は、'a' でも "a" でもかまいません。
string::npos は、str.npos でもかまいません。

Kaien
記事: 6
登録日時: 6年前
住所: 東京

Re: stringのfind関数について

#3

投稿記事 by Kaien » 6年前

こんばんは。
DOG さんが書きました: find() の第1引数は、'a' でも "a" でもかまいません。
とありますが、find関数はそれに限定する理由でもあるのでしょうか。
あるようでしたら、以下は見当はずれな回答をしているので、無視して頂いて構いません。

さて、見当はずれかもしれませんが、find関数にはオーバーロードされた関数を使用すればDOG様のやりたい事が出来るのではないでしょうか。

とりあえず、以下みたいな感じで書いてみました。

コード:

#include <iostream>
#include <string>

int main(void)
{
    using namespace std;
    string seq = "takeshikita";
    char search = 'a';
    int n;

    string::iterator itr = std::find(seq.begin(), seq.end(), search); 
    while (itr != seq.end())    
    {
        n = static_cast<int>(distance(seq.begin(), itr++));
        cout << n << endl;
        itr = find(itr, seq.end(), search); //発見後のイテレーターより後を再検索
    }
    return 0;
}

DOG
記事: 27
登録日時: 6年前

Re: stringのfind関数について

#4

投稿記事 by DOG » 6年前

>>かずま様
ご返信ありがとうございます。
詳細にコードを書いていただき感謝します。
なるほど、find()関数にはそのような使い方もあったのですね。
勉強になりました。

>>Kaien様
ご返信ありがとうございます。
イテレータを使えばそのように華麗にコードを記述することが出来るのですね。
イテレータに関しましては勉強不足なところもあり、使いこなせるようになるにはまだほど遠いですが、
近いうちに使えるようになりたいと思っております。
ちなみになのですが、find()関数に3つの引数が使われています。
2つまで引数が使われているのなら見ましたが、それは初めてです。
find(seq.begin(), seq.end(), search);
は、文字列seqの最初から最後までで、'a' を探しているということでしょうか?

Kaien
記事: 6
登録日時: 6年前
住所: 東京

Re: stringのfind関数について

#5

投稿記事 by Kaien » 6年前

DOG さんが書きました: find(seq.begin(), seq.end(), search);
は、文字列seqの最初から最後までで、'a' を探しているということでしょうか?
はい、その通りです。
この場合の引数が3つのfind関数では、
第1引数:検索対象の文字列の先頭
第2引数:検索対象の文字列の終端
第3引数:検索したい文字列
となっています。

この時、第1,第2引数指定した範囲内に第3引数で指定した値が存在すれば、最初に見つけた要素の位置のイテレータを返します。
逆に存在しない場合には、第2引数に指定 した位置(この場合は終端)が返されます。

参考までにfind関数の引数が3つ使われている場所のURLをはっておきます。
http://ppp-lab.sakura.ne.jp/cpp/library/016.html

DOG
記事: 27
登録日時: 6年前

Re: stringのfind関数について

#6

投稿記事 by DOG » 6年前

>>Kaienさま
URLまで教えていただき、ありがとうございました。
そのホームページ自体勉強になりそうなページですね。
また何かありましたらよろしくお願い致します。

かずま

Re: stringのfind関数について

#7

投稿記事 by かずま » 6年前

stringクラスのメンバ関数である find について質問されているのに、
それとは別物の、STL の algorithm の find関数を持ち出してくるのは、
質問者に混乱を与えるだけだと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る