【发布时间】:2010-10-22 17:37:00
【问题描述】:
我昨天花了大约 4 个小时试图在我的代码中解决这个问题。我将问题简化为下面的示例。
想法是将字符串存储在以 std::ends 结尾的字符串流中,然后稍后检索它并将其与原始字符串进行比较。
#include您可能已经猜到了,上面的代码在执行时不会打印任何内容。
虽然,如果打印出来,或者在调试器 (VS2005) 中查看,HELLO 和 hi 看起来相同,它们的 .length() 实际上相差 1。我猜这就是导致“==”运算符失败。
我的问题是为什么。我不明白为什么 std::ends 是添加到字符串 hi 的不可见字符,即使 hi 和 HELLO 具有相同的内容,它们的长度也会不同。此外,这个不可见的角色不会被增强修剪修剪。但是,如果您使用 strcmp 比较两个字符串的 .c_str(),则比较可以正常进行。
我首先使用 std::ends 的原因是因为我过去遇到过 stringstream 在流末尾保留垃圾数据的问题。 std::ends 为我解决了这个问题。
【问题讨论】:
-
好的,我了解这背后的机制,但我不喜欢语义。似乎我有两个选择:不使用 std::ends 并冒着产生垃圾数据的风险,或者使用它并添加自定义代码以消除额外的 NULL 字符。
-
您应该尝试设计您的代码,以便您知道字符串的期望是什么 - 例如,如果您从网络设备读取字符串,它们可能不是以空值结尾的,但这取决于您正在使用的 API,但如果您在应用程序内部传递字符串,那么它们可能是。不要陷入您不知道数据中有什么的情况。
-
你为什么还要使用末端?这仅在您从原始数据构建空终止的 C 样式字符串时使用。在这里,在您的示例中,它显然不合适。你已经有了一个 C++ 字符串。