2017-04-07 90 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

我有一個固定的緩衝區大小,所以追加一個字節的額外和初始化整個數組與零個字符將解決此問題。是的:)最好的解決方案是最簡單的。謝謝 –