本文主要是介绍为什么 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::string
HELLO 中。
const std::string HELLO( "hello" );std::stringstream testStream;
我们现在将string
HELLO(包括尾随的 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 会导致字符串比较失败?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!