子串与std :: memcmp或string :: compare的比较?

时间:2017-04-03 09:39:44

标签: 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;
}

Ideone

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

2 个答案:

答案 0 :(得分:4)

安全且冗余,因为std::char_traits<char>::compare无论如何在大多数标准库供应商上使用memcmp(我检查了VC ++和GCC,它使用memcmp__builtin_memcmp分别)。

从表现来看 - 它不会有太大变化。

更好地坚持std::string::compare

答案 1 :(得分:1)

您可以使用std::string_view

bool matchSubstring(std::string_view haystack, 
                    std::string_view needle, 
                    std::size_t pos)
{
    if(haystack.size() < pos + needle.size()) return false;
    return haystack.compare(pos, needle.size(), needle) == 0;
}

用法:

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

std::cout << std::boolalpha << matchSubstring(input, keyword, 4) << "\n"
                            << matchSubstring(input, keyword, 5) << "\n"
                            << matchSubstring(input, keyword, 1000) << "\n";
  

true false false

live wandbox example