2017-04-07 39 views
2

存在一个大小为8个字符的接收缓冲区。它的定义是,接收到的字符是一个字符串。没有定义(没有保证)该字符串被零字符终止。安全(与平台无关)char缓冲区为std :: string

简单的例子:

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)); 

我还没有找到标准这样的功能。标准工具有没有优雅的解决方案?也许是一条线索?

+2

'ReceiveIncommingMessage'是否不告诉你消息的大小? – NathanOliver

+0

http://en.cppreference.com/w/c/string/byte/strlen –

+0

@NathanOliver:不,不幸的是我没有收到消息的大小的信息。我只能得到缓冲区被填充的信息。 –

回答

5

如果你让你的缓冲区长度为9(处理情况字符的来电号码正是8W/OA终止“\ 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函数。

+0

我有一个固定的缓冲区大小,所以追加一个字节的额外和初始化整个数组与零个字符将解决此问题。是的:)最好的解决方案是最简单的。谢谢 –