如何在C++中比较包含中间空字符\0的字符串?
包含中间空字符的std::string比较方案
大小写敏感比较(替代strcmp)
C标准库的strcmp会在遇到第一个\0时停止比较,无法处理包含中间空字符的std::string。你可以用C++标准库的工具实现完整字符串的比较:
直接判断两个字符串是否完全相等:
#include <string> #include <algorithm> bool is_equal(const std::string& s1, const std::string& s2) { return s1.size() == s2.size() && std::equal(s1.begin(), s1.end(), s2.begin()); }模拟
strcmp的返回值逻辑(返回<0、0、>0分别表示s1小于、等于、大于s2):int strcmp_full(const std::string& s1, const std::string& s2) { if (s1.size() != s2.size()) { return s1.size() < s2.size() ? -1 : 1; } for (size_t i = 0; i < s1.size(); ++i) { unsigned char c1 = static_cast<unsigned char>(s1[i]); unsigned char c2 = static_cast<unsigned char>(s2[i]); if (c1 != c2) { return c1 - c2; } } return 0; }
大小写不敏感比较(替代strcasecmp)
同理,strcasecmp会被\0截断,需要自定义遍历所有字符的逻辑:
模拟
strcasecmp的返回值逻辑:#include <cctype> #include <string> int strcasecmp_full(const std::string& s1, const std::string& s2) { if (s1.size() != s2.size()) { return s1.size() < s2.size() ? -1 : 1; } for (size_t i = 0; i < s1.size(); ++i) { unsigned char c1 = static_cast<unsigned char>(s1[i]); unsigned char c2 = static_cast<unsigned char>(s2[i]); int lower_c1 = std::tolower(c1); int lower_c2 = std::tolower(c2); if (lower_c1 != lower_c2) { return lower_c1 - lower_c2; } } return 0; }用
std::lexicographical_compare实现:#include <algorithm> #include <cctype> #include <string> bool case_insensitive_less(char a, char b) { return std::tolower(static_cast<unsigned char>(a)) < std::tolower(static_cast<unsigned char>(b)); } int strcasecmp_full(const std::string& s1, const std::string& s2) { if (s1.size() != s2.size()) { return s1.size() < s2.size() ? -1 : 1; } bool s1_less = std::lexicographical_compare(s1.begin(), s1.end(), s2.begin(), s2.end(), case_insensitive_less); bool s2_less = std::lexicographical_compare(s2.begin(), s2.end(), s1.begin(), s1.end(), case_insensitive_less); if (s1_less) return -1; if (s2_less) return 1; return 0; }
关键说明
std::string的c_str()返回的是指向首个字符的指针,但字符串的实际长度由size()方法决定——它包含所有中间的\0字符。因此,必须基于size()遍历整个字符串内容,而不是依赖C标准库中以\0为终止符的函数。
内容的提问来源于stack exchange,提问作者250
相关产品推荐
相关产品推荐

