子字符串与 std::memcmp 或字符串::比较的比较
Substring comparision with std::memcmp or string::compare?
我想在另一个字符串中找到给定的字符串。通过先前的计算已知可能的起始位置。例:
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;
}
艾德酮
两者等效吗?如果关键字长度超过起始位置的输入长度,则与memcmp
的比较仍然是正确的。strncmp
更安全的方法吗?
它是
安全的,也是冗余的,因为无论如何std::char_traits<char>::compare
大多数标准库供应商都使用memcmp
(我检查了VC++和GCC,它们分别使用memcmp
和__builtin_memcmp
(。
至于性能 - 它不会有太大变化。
最好坚持std::string::compare
.
您可以使用
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";
真 假 假
活魔杖盒示例
相关文章:
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 字符串比较中的意外输出
- 如何执行不区分大小写的字符串比较?
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- <<运算符优先级与字符串比较
- ">"运算符和"<"运算符如何进行字符串比较?
- Qt C++11 字符串通过子字符串比较列出交集
- std::out_of_range字符串比较中的异常
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 字符* 与uint8_t的字符串比较
- 用字符串 c++ 比较对向量的元素
- 使用循环进行词典字符串比较
- 如何为C++映射创建自己的字符串比较对象
- 不带比较()的字符串比较
- 与 IF 语句C++的字符串比较?
- 字符串比较在与变量一起使用时给出不同的输出
- 更快的字符串比较排序,用于唯一()
- C 字符串比较“祝您好运”&gt;“再见”
- C 奇怪的行为和字符串比较
- 子字符串与 std::memcmp 或字符串::比较的比较