- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在做很多解析/处理,其中给出了前导/尾随空格和不区分大小写。因此,我为 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;
}
最佳答案
将具有不止一种可能表示的数据转换为“标准”或“正常”形式称为规范化。对于文本,它通常意味着去除重音、大小写、修剪空白字符和/或格式字符。
如果规范化在每次比较期间都在幕后完成,那么它是脆弱的。例如,您如何测试 s1
和 s2
是否正确完成?它也不灵活,例如你不能显示它的结果或缓存它以供下一次比较。因此,将其作为显式规范化步骤来执行会更加稳健和高效。
What is the reason for having this additional "shorter one" ordering if trait's compare returns 0?
Traits 比较只需要比较 n
个字符,所以当您比较 "hellow"
和 "hello"
时,它应该返回什么?它应该返回 0
。如果您以某种方式忽略了那个 n
,那么您就处于有缺陷的情况下,因为这些特征应该与不是零终止的 std::string_view
一起使用。如果删除大小比较,则 "hellow"
和 "hello"
将比较相等,这可能是您不希望的。
关于c++ - basic_string 的前导/尾随空格不敏感特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53030287/
我这里有一些(遗留)代码,似乎在LD_LIBRARY_PATH上调用setenv(其值在编译时未知,实际上它将从命令中获取)行),现在我必须将其移植到 Windows。我怀疑 setenv 只是出于历
我在 SSIS 包上有一个敏感字符串参数,用于存储远程服务器的密码。 但是,当字符串值包含花括号时,作业代理会在配置该步骤的包参数时抛出错误: Microsoft SQL Server Managem
我们都非常了解 strictfp 的工作原理。 像这样: package com.hk.basicjava.tests.strictfp; import java.util.*; public cla
我正在对我的博客进行简单搜索。我使用亚美尼亚语,当我搜索时,这些字母总是很敏感。这是我的代码的一部分。提前谢谢你。 search_query = get.get('search') query_lis
我正在对我的博客进行简单搜索。我使用亚美尼亚语,当我搜索时,这些字母总是很敏感。这是我的代码的一部分。提前谢谢你。 search_query = get.get('search') query_lis
想象一下这个非常基本的可拖放设置: #dropArea 是可放置的。 #itemBox > .item 是可拖动对象。 由于某种原因,droppable
我有这样的网址: http://quickstart.local/public/category1/product2 并且在 url (category1/product2) 数字是 id ,从数据库
我是一名优秀的程序员,十分优秀!