string.find()不返回-1

时间:2013-04-01 09:25:17

标签: c++

以下代码很简单。据我所知,如果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");
}

5 个答案:

答案 0 :(得分:10)

除了完全正确的其他答案之外,我只是想补充一点,你的while循环无论如何都会产生无限循环。例如:

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

将是一个无限循环,因为它将继续尝试在toReplace中找到text字符串,并且它将始终找到它(因为find每次都从字符串的开头开始)。这可能不是你想要的。

答案 1 :(得分:8)

如果找不到搜索到的子字符串,

std::string::find会返回std::string::npos,而不是-1npos的确切值是实现定义的,因此请使用npos,如

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

考虑到它,find无法返回-1,即使它想要,因为find的返回类型被指定为std::size_t,这是 unsigned 类型。

此外,无论您调用多少次,find 始终都会搜索子字符串的第一次次。如果你想迭代所有的事件,你应该使用find的重载,它带有第二个参数 - 开始搜索的位置。

答案 2 :(得分:5)

无论是谁告诉你这个或你在哪里阅读它,它都骗了你。

如果std::string::find失败,则会返回std::string::npos,而不是-1

如果您不确定,请查看有关此类事项的文档。

因此,您的while将类似于:

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

关于你的评论:

  

更新:我尝试使用while(text.find(toReplace)!= string :: npos)但我仍然得到无限循环:( - user2167403 10秒前

你应该学会阅读documentation。使用变量存储std::string::find的最后结果(与std::string::npos不同)并使用std::string::find的第二个参数 - pos(通过值 - last_match_position + 1 )。

省略第二个参数std::string::find总是从字符串的开头开始,这会导致无限循环。

答案 3 :(得分:0)

在您提供的代码段中,text变量包含存储在toReplace变量中的子字符串“ijk”。只要在while周期中texttoReplace变量都没有改变,find方法总是返回-1值,这是while循环继续的条件。

正如在其他评论中已经提到的那样,你应该检查不是-1而是std::string::npos

答案 4 :(得分:0)

阅读手册页确实有帮助(string :: npos就是答案)。

请参阅http://www.cplusplus.com/reference/string/string/find/