为什么 std::ends 会导致字符串比较失败?

2023-11-30 12:38

本文主要是介绍为什么 std::ends 会导致字符串比较失败?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

我昨天花了大约 4 个小时试图在我的代码中解决这个问题。我将问题简化为下面的示例。

这个想法是将字符串存储在以stringstream结尾std::ends,然后稍后检索它并将其与原始字符串进行比较。

#include <sstream>
#include <iostream>
#include <string>int main( int argc, char** argv )
{const std::string HELLO( "hello" );std::stringstream testStream;testStream << HELLO << std::ends;std::string hi = testStream.str();if( HELLO == hi ){std::cout << HELLO << "==" << hi << std::endl;}return 0;
}

正如您可能猜到的那样,上面的代码在执行时不会打印任何内容。

虽然,如果打印出来,或者在调试器(VS2005)中查看,HELLO并且hi看起来相同,它们.length()实际上相差 1。这就是我猜测导致==操作员失败的原因。

我的问题是为什么。我不明白为什么即使它们具有相同的内容,也会std::ends将一个不可见的字符添加到 string hi、 makehi和不同的长度。HELLO此外,这个不可见的角色不会被增强修剪修剪。但是,如果您用于strcmp比较.c_str()两个字符串,则比较可以正常工作。

我首先使用的原因std::ends是因为我过去stringstream在流的末尾保留垃圾数据时遇到过问题。std::ends为我解决了这个问题。

解决方案

std::ends只是一个空字符。传统上,C 和 C++ 中的字符串以空(ascii 0)字符结尾,但事实证明这std::string并不真正需要这个东西。无论如何,要逐点执行您的代码,我们会看到一些有趣的事情发生:

int main( int argc, char** argv )
{

字符串文字"hello"是传统的以零结尾的字符串常量。我们将整个复制到std::stringHELLO 中。

   const std::string HELLO( "hello" );std::stringstream testStream;

我们现在将stringHELLO(包括尾随的 0)放入stream,然后是第二个 null ,它通过调用 放在那里std::ends

std::ends。testStream << HELLO << std::ends;

我们提取出我们放入的内容的副本stream(文字字符串“hello”,加上两个空终止符)。

    std::string hi = testStream.str();

operator ==然后我们使用类上的比较这两个字符串std::string。该运算符(可能)比较string对象的长度 – 包括有多少尾随空字符。请注意,std::string该类不要求底层字符数组以尾随空字符结尾——换句话说,它允许字符串包含空字符,因此两个尾随空字符中的第一个被视为字符串的一部分hi

由于两个字符串的尾随空值数量不同,因此比较失败。

    if( HELLO == hi ){std::cout << HELLO << "==" << hi << std::endl;}return 0;
}

虽然,如果打印出来,或者在调试器(VS2005)中查看,HELLO 和 hi 看起来相同,但它们的 .length() 实际上相差 1。这就是我猜测导致“==”运算符失败的原因。

原因是,长度相差一个尾随空字符。

我的问题是为什么。我不明白为什么 std::ends 是添加到字符串 hi 的不可见字符,即使 hi 和 HELLO 具有相同的内容,它们的长度也会不同。此外,这个不可见的角色不会被增强修剪修剪。但是,如果您使用 strcmp 比较两个字符串的 .c_str(),则比较可以正常进行。

strcmp不同于std::string– 它是在早期以空值终止字符串时写的 – 所以当它到达第一个尾随空值时hi它停止查找。

我首先使用 std::ends 的原因是因为我过去遇到过 stringstream 在流末尾保留垃圾数据的问题。std::ends 为我解决了这个问题。

有时,了解底层表示是一个好主意。

原文链接:为什么 std::ends 会导致字符串比较失败?

这篇关于为什么 std::ends 会导致字符串比较失败?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437066

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>

PHP字符串全排列

方法一: $str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) {if($k == $m){ echo join('',$ar), PHP_EOL;}else {for($i=$k; $i<=$m; $i++) {swap($ar[$k], $ar[$i]);perm($ar

PHP7扩展开发之字符串处理

前言 这次,我们来看看字符串在PHP扩展里面如何处理。 示例代码如下: <?phpfunction str_concat($prefix, $string) {$len = strlen($prefix);$substr = substr($string, 0, $len);if ($substr != $prefix) {return $prefix." ".$string;} else

DAY16:什么是慢查询,导致的原因,优化方法 | undo log、redo log、binlog的用处 | MySQL有哪些锁

目录 什么是慢查询,导致的原因,优化方法 undo log、redo log、binlog的用处  MySQL有哪些锁   什么是慢查询,导致的原因,优化方法 数据库查询的执行时间超过指定的超时时间时,就被称为慢查询。 导致的原因: 查询语句比较复杂:查询涉及多个表,包含复杂的连接和子查询,可能导致执行时间较长。查询数据量大:当查询的数据量庞大时,即使查询本身并不复杂,也可能导致