我开始编写发现子串的程序,但它不起作用,它总是找到子串。这是奇怪的行为所以我写了简单的程序:
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
str = "aaaa";
unsigned found = str.find("bbbb");
if(found!=std::string::npos){
cout << "I FOUND IT!!!!\n";
}
return 0;
}
它显示文字“I FOUND IT !!!!”我不明白发生了什么。
答案 0 :(得分:6)
std::string::find
返回size_t
std::string::npos
被定义为适合size_t的最大值,对于64位程序可能是0xFFFFFFFFFFFFFFFF
。
当你将它转换为unsigned int时,这可能是32位,所以0xFFFFFFFF
作为0xFFFFFFFFFFFFFFFF != 0xFFFFFFFF
,您会看到结果。
答案 1 :(得分:1)
我编译了您的确切代码并在VS2008中运行它并且完全符合预期 - 所以我认为代码根本没有问题。
编辑:从其中一位评论者发现是unsigned int的好点!使它成为size_t类型,我敢打赌它会起作用,无论机器架构如何。答案 2 :(得分:1)
string :: npos的类型为size_t而不是整数类型,所以在64位机器上“找到”必须是无符号长或只是size_t。
答案 3 :(得分:0)
确保您使用的是与std :: string :: npos使用的相同类型。在我的Windows 7 PC上,它使用'unsigned int'。我测试了你的代码,它对我有用。 如果您在Visual Studio 2012中(使用C ++ 0x),则可以使用“auto”类型。
auto found = str.find("bbbb");