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并且它总是会找到它(那是因为 find 每次都从字符串的开头开始)。这可能不是您想要的。

于 2013-04-01T09:33:16.017 回答
8

std::string::findstd::string::npos如果未找到搜索的子字符串,则返回not -1。的确切值npos是实现定义的,所以使用npos,如

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

想一想,find即使它想返回也无法返回 -1,因为 find 的返回类型被指定为std::size_t符号类型。

此外,无论您调用多少次,find总是会搜索第一次出现的子字符串。如果你想遍历所有出现的地方,你应该使用find带第二个参数的重载 - 开始搜索的位置。

于 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的第二个参数 - pos(通过传递值 - last_match_position + 1)。

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

于 2013-04-01T09:26:35.957 回答
0

在您提供的代码片段中,text变量包含存储在变量中的子字符串“ijk” toReplace。只要在 while 循环中没有改变texttoReplace变量没有改变,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 回答