【发布时间】:2023-03-30 05:38:01
【问题描述】:
我正在做很多解析/处理,其中给出了前导/尾随空格和不区分大小写。所以我为std::basic_string(见下文)制作了一个基本的字符特征来为自己节省一些工作。
特征不起作用,问题是basic_string 的比较调用特征比较,如果评估为 0,则返回大小差异。在basic_string.h 它说 ...如果比较的结果是非零返回它,否则首先排序较短的。 看起来他们明确不希望我这样做...
如果 trait 的比较返回 0,那么为什么会有这个额外的 “较短的一个” 排序?而且,有什么解决方法还是我必须自己滚动字符串?
#include <cstring>
#include <iostream>
namespace csi{
template<typename T>
struct char_traits : std::char_traits<T>
{
static int compare(T const*s1, T const*s2, size_t n){
size_t n1(n);
while(n1>0&&std::isspace(*s1))
++s1, --n1;
while(n1>0&&std::isspace(s1[n1-1]))
--n1;
size_t n2(n);
while(n2>0&&std::isspace(*s2))
++s2, --n2;
while(n2>0&&std::isspace(s2[n2-1]))
--n2;
return strncasecmp(static_cast<char const*>(s1),
static_cast<char const*>(s2),
std::min(n1,n2));
}
};
using string = std::basic_string<char,char_traits<char>>;
}
int main()
{
using namespace csi;
string s1 = "hello";
string s2 = " HElLo ";
std::cout << std::boolalpha
<< "s1==s2" << " " << (s1==s2) << std::endl;
}
【问题讨论】:
-
不是答案,而是
std::isspace(x),其中x是char必须写成std::isspace((unsigned char)x)。否则你会得到undefined behavior for negative character codes。 -
@HolyBlackCat 是的,谢谢 :)
标签: c++ stdstring char-traits