c++ - 将 char 缓冲区安全(独立于平台)到 std::string

标签 c++ string c++11 c++14

有一个大小为 8 个字符的接收缓冲区。定义接收到的字符是一个字符串。没有定义(没有保证)字符串以零字符结尾。

简单的例子:

char cBuffer[ 8 ]{ 0 };
ReceiveIncommingMessage( cBuffer );
std::string sStringForFurtherComparison( cBuffer, strlen( cBuffer) );

此示例适用于接收到的字符串小于 8 字节的所有情况。我还想捕获这样的情况,即接收到的字符串不是以零字符结尾或者恰好是 8 字节长。

具有最大长度的 strlen_s( buffer, max_length ) 可以解决这个问题,所以我可以做这样的事情:

std::string sStringForFurtherComparison( cBuffer, strlen_s( cBuffer, sizeof( cBuffer ) );

我在标准中没有找到这样的函数。有没有使用标准工具的优雅解决方案?也许是单线?

最佳答案

如果您将缓冲区长度设置为 9(以处理传入字符数恰好为 8 且不带终止符 '\0' 的情况),则此方法有效:

char cBuffer[ 9 ]{ 0 };
ReceiveIncommingMessage( cBuffer );
std::string sStringForFurtherComparison( cBuffer );

构造函数接受一个 char * 并且将在第一个“\0”字符处停止。因此这将处理长度为 0 到 8 个字符的消息。作为引用,即本页上的构造函数 (5):http://en.cppreference.com/w/cpp/string/basic_string/basic_string

我想补充一点,这取决于您对 ReceiveIncommingMessage 函数的信任程度。

关于c++ - 将 char 缓冲区安全(独立于平台)到 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43286254/

相关文章:

c++ - libsigc 如何包含在 gtkmm 项目中?

python - 在python中解析一个字符串直到一个空格以形成一个列表

C# 字符串解析为数组

c++ - 写智能指针和指针的泛型代码时,如何获取简单指针?

c++ - 静态链接到 Qt 时加载 Qt 插件?

c++ - 在两个 channel 矩阵中插入数据

c++ - std::unordered_map<Foo, Bar> 测试特定的 Foo 键是否存在

c++ - utf-8 中 std::string 的子字符串? C++11

c++ - ASCII "graphics"库?

javascript - 替换字符串切片