以下代码很简单。据我所知,如果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");
}
答案 0 :(得分:10)
除了完全正确的其他答案之外,我只是想补充一点,你的while循环无论如何都会产生无限循环。例如:
while(text.find(toReplace) != std::string::npos)
counter++;
将是一个无限循环,因为它将继续尝试在toReplace
中找到text
字符串,并且它将始终找到它(因为find每次都从字符串的开头开始)。这可能不是你想要的。
答案 1 :(得分:8)
std::string::find
会返回std::string::npos
,而不是-1
。 npos
的确切值是实现定义的,因此请使用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周期中text
或toReplace
变量都没有改变,find方法总是返回-1值,这是while循环继续的条件。
正如在其他评论中已经提到的那样,你应该检查不是-1而是std::string::npos
。
答案 4 :(得分:0)
阅读手册页确实有帮助(string :: npos就是答案)。