0

以下のコードは簡単です。私が知っているように、string::find() が一致を見つけられなかった場合、-1 を返します。しかし、いくつかの理由で、以下のコードは機能しません。このコードを実行するたびに、無限ループが発生します。ご協力ありがとう御座います!

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

int main()
{
    string text;
    text = "asdasd ijk asdasd";
    string toReplace = "ijk";
    cout<<text<<endl;
    int counter = 0;
    while ( text.find(toReplace) != -1)
        counter++;

    cout<<counter<<endl;

    system("pause");
}
4

5 に答える 5

11

完全に正しい他の答えは別として、とにかくあなたの while ループが無限ループを生成することを追加したかっただけです。例えば:

while(text.find(toReplace) != std::string::npos)
    counter++;

toReplace文字列を検索しようとし続け、常に検索するため、無限ループになりtextます (これは、検索が毎回文字列の先頭から開始されるためです)。これはおそらく意図したものではありません。

于 2013-04-01T09:33:16.017 に答える
8

std::string::findstd::string::nposではなく、検索された部分文字列が見つからない場合に を返します-1。の正確な値nposは実装定義であるため、次のように を使用nposします。

while ( text.find(toReplace) != std::string::npos)

そういえば、find の戻り値の型がunsignedfind型に指定されているため、戻りたくても -1 を返すことができませんでした。std::size_t

さらに、find は、何回呼び出しても、常に部分文字列の最初の出現を検索します。すべてのオカレンスを反復処理する場合findは、2 番目のパラメーター (検索を開始する位置) を取るオーバーロードを使用する必要があります。

于 2013-04-01T09:26:21.597 に答える
5

誰があなたにこれを言ったにせよ、どこで読んだにせよ、それはあなたに嘘をつきました。

失敗した場合std::string::findは を返しますがstd::string::npos、これは ではありません-1

よくわからない場合は、そのようなことについてのドキュメントを確認する必要があります。

したがって、あなたのwhile意志は次のようになります。

while ( std::string::npos != text.find(toReplace) )

あなたのコメントについて:

更新: while ( text.find(toReplace) != string::npos ) を使用しようとしましたが、それでも無限ループが発生します :( – user2167403 10 秒前

ドキュメントを読むことを本当に学ぶべきです。std::string::find変数を使用して( とは異なるstd::string::npos)の最後の結果を格納し、std::string::findの 2 番目のパラメーターを使用しますpos(値を渡すことにより - last_match_position + 1)。

2 番目のパラメーターを省略すると、std::string::find常に文字列の先頭から開始されるため、無限ループが発生します。

于 2013-04-01T09:26:35.957 に答える
0

あなたが提供したコードスニペットでは、変数に変数textに格納されている部分文字列「ijk」が含まれていtoReplaceます。while サイクルで変数が変更されていないtextか、変更されていない限りtoReplace、find メソッドは常に -1 値を返しません。これは、while サイクルが継続するための条件です。

他のコメントで既に述べたように、-1 ではなく をチェックする必要がありstd::string::nposます。

于 2013-04-01T09:29:46.097 に答える
0

マニュアルページを読むと役に立ちます (string::npos が答えです)。

http://www.cplusplus.com/reference/string/string/find/を参照してください。

于 2013-04-01T09:30:36.950 に答える