与 std::memcmp 或 string::compare 进行子字符串比较?

agg*_*sol 2 c++ string c++14 c++17

我想在另一个字符串中找到给定的字符串。通过先前的计算已知可能的起始位置。例子:

int main()
{
    std::string input("Foo Bar Hash Bang");
    std::string keyword("Bar");

    const char* inputStart = input.c_str() + 4; // at 'B'
    std::cout << "memcmp=" << std::memcmp(inputStart, keyword.c_str(), keyword.length()) << "\n";

    std::cout << "compare=" << input.compare(4, keyword.length(), keyword) << "\n";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

伊迪奥内

两者等价吗?如果关键字长度超过从起始位置开始的输入长度,则比较memcmp仍然是正确的。是strncmp更安全的方法吗?

Dav*_*aim 5

它是安全的、冗余的,就像大多数标准库供应商所std::char_traits<char>::compare使用的那样(我检查了 VC++ 和 GCC,它们分别使用和)。memcmpmemcmp__builtin_memcmp

至于性能 - 不会有太大变化。

最好坚持std::string::compare