0

我开始为发现子字符串编写程序,但它不起作用并且它总是找到子字符串。这是奇怪的行为,所以我编写了简单的程序:

#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;
}

它显示文本“我找到了!!!!!!” 我不明白发生了什么事。

4

4 回答 4

6

std::string::find返回一个 size_t

std::string::npos被定义为适合 size_t 的最大值,可能0xFFFFFFFFFFFFFFFF适用于 64 位程序。

当您将其转换为无符号整数时,这可能是 32 位,因此0xFFFFFFFF

0xFFFFFFFFFFFFFFFF != 0xFFFFFFFF你得到你看到的结果。

于 2013-05-02T23:25:19.930 回答
1

我编译了您的确切代码并在 VS2008 中运行它,它完全按预期工作 - 所以我认为代码根本没有问题。

编辑:嗯,一位评论者的好点是重新发现是无符号整数!让它成为 size_t 类型,我敢打赌它会工作,无论机器架构如何。

于 2013-05-02T23:23:22.887 回答
1

string::npos 是 size_t 类型而不是整数类型,因此在 64 位机器上“找到”必须是 unsigned long 或只是 size_t。

于 2013-05-02T23:24:16.373 回答
0

确保您使用的类型与 std::string::npos 使用的类型相同。在我的 Windows 7 PC 上,它使用“unsigned int”。我测试了你的代码,它对我有用。如果您使用的是 Visual Studio 2012(使用 C++0x),那么您可以使用类型“auto”。

auto found = str.find("bbbb");
于 2013-05-02T23:24:51.623 回答