我正在进行大量解析/处理工作,其中包括前导/尾随空格和不区分大小写。因此,我为
该特征不起作用,问题在于
为什么要有这个额外的"较短的字符串"排序?是否有任何解决方法,还是我必须自己编写字符串处理代码?
std::basic_string
创建了一个基本的字符特征(见下文),以省去一些工作。该特征不起作用,问题在于
basic_string
的比较调用了特征比较函数,如果计算结果为0,则返回大小差异。在basic_string.h
中,它说: ...如果比较的结果为非零值,则返回该值,否则较短的字符串比较小。 看起来他们明确不希望我这样做...为什么要有这个额外的"较短的字符串"排序?是否有任何解决方法,还是我必须自己编写字符串处理代码?
#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)
。否则,您会因为负字符代码而产生未定义的行为。 - HolyBlackCat