【发布时间】:2016-08-29 13:31:00
【问题描述】:
也许只是缺少咖啡,但我正在尝试从具有已知最大长度的空终止 char 数组创建一个 std::string,但我不知道该怎么做。
auto s = std::string(buffer, sizeof(buffer));
.. 是我最喜欢的候选者,但由于 C++ 字符串不是以 null 结尾的,因此该命令将复制 sizeof(buffer) 字节,而不管包含任何“\0”。
auto s = std::string(buffer);
.. 从buffer 复制直到找到\0。这几乎是我想要的,但我不能信任接收缓冲区,所以我想提供一个最大长度。
当然,我现在可以像这样集成strnlen():
auto s = std::string(buffer, strnlen(buffer, sizeof(buffer)));
但这看起来很脏 - 它遍历缓冲区两次,我必须处理像 string.h 和 strnlen() 这样的 C 工件(而且很丑)。
我将如何在现代 C++ 中做到这一点?
【问题讨论】:
-
它要么是空终止,要么长度正好是 sizeof(buffer),不能同时是两者。
-
这不是真的(我对赞成票感到惊讶)。为任何类型的写入函数提供的 C 缓冲区可以预先分配固定大小。写入缓冲区的序列仍然可以空终止。
-
无论如何这只是一个小问题。正确的术语是“可能以空结尾的最大长度 N 数组”或类似的东西。
-
A C-buffer provided to any sort of writing function对于这种情况,我会预先分配一个额外的字符char buffer[n+1]; buffer[n] = 0;。然后使用std::string(buffer),因为字符串始终以空值结尾。 -
或者只是在缓冲区的最后一个字节中粘贴 null 。最坏的情况是,您丢失了一个可能已经被截断的字符串。
标签: c++ arrays string c++11 char