String.find()错误地返回true

string.find() returns true wrongfully

本文关键字:返回 true 错误 find String      更新时间:2023-10-16

代码解释了我要做的事情

auto haystack = wstring(L"REGISTRYMACHINESOFTWAREWOW6432NodeDataPath");
auto needle = wstring(L"WOW6432NodeDataName");
auto found = haystack.find(needle) != haystack.npos;
cout << found << endl;

返回true,尽管needlehaystack不同,注意前者以Path结束,而后者以Name结束…我怎样才能准确地知道某个字符串是否包含另一个字符串呢?

由于终止'',字符串比您想象的要短:

auto haystack = std::wstring(L"REGISTRYMACHINESOFTWAREWOW6432NodeData");
auto needle = std::wstring(L"WOW6432NodeData");

其他非预期的转义序列应该产生一个编译器警告:

g++: warning:未知转义序列:'R'(…)和更多)

您可以查看:http://en.cppreference.com/w/cpp/language/string_literal

字符是转义字符。要使用实际的字符,你需要用\.转义它,所以你的代码需要这样修改:

auto haystack = wstring(L"\REGISTRY\MACHINE\SOFTWARE\WOW6432Node\Data\0\Path");
auto needle = wstring(L"\WOW6432Node\Data\0\Name");
auto found = haystack.find(needle) != haystack.npos;
cout << found << endl;

你可以这样做:

wstring haystack = wstring(LR"P(REGISTRYMACHINESOFTWAREWOW6432NodeDataPath)P");
wstring needle = wstring(LR"P(WOW6432NodeDataName)P");
bool found = haystack.find(needle) != haystack.npos;
cout << (char*)(found?"True":"False") << endl;

是一个问题,因为它过早地结束构造函数