我正在學習套接字編程,我的專案中需要放入\r\n每條回傳的訊息。我注意到\r\n當它超過一定數量的字符時會洗掉整個緩沖區。例如,我有這樣的代碼:
#include <iostream>
int main()
{
std::string message = "mkdir homewor";
const char *buffer = (message "\r\n").c_str();
std::cout << "message: " << message << std::endl;
std::cout << "buffer: " << buffer << std::endl;
}
我跑了,它給了我這樣的輸出:
message: mkdir homewor
buffer: mkdir homewor
我打開gdb它,它給了我這樣的東西:
message: "mkdir homewor"
buffer: 0x7fffffffdc50 "mkdir homewor\r\n"
- *buffer: 109 'm'
這是我所期待的。
但是當訊息太長并且我將其轉換為 C-String 時,整個緩沖區都會被洗掉。例如:
#include <iostream>
int main()
{
std::string message = "mkdir homework"; // Just one more 'k' at the end
const char *buffer = (message "\r\n").c_str();
std::cout << "message: " << message << std::endl;
std::cout << "buffer: " << buffer << std::endl;
}
我跑了,它給了我輸出:
message: mkdir homework
buffer:
gdb給了我這個:
message: "mkdir homework"
buffer: 0x55555556aeb0 ""
- *buffer: 0 '\000'
另一個觀察是,如果訊息具有或超過第二個示例中的訊息長度,則無論如何都會洗掉緩沖區。誰能告訴我這個問題是什么?我無法擺脫,\r\n因為它在專案中是必需的。
提前致謝。
uj5u.com熱心網友回復:
(message "\r\n")創建一個新的 std::string,并以指標為后盾。這個新的 std::string 將在完整運算式的末尾被銷毀。
所以你應該這樣做,
#include <iostream>
int main()
{
std::string message = "mkdir homework"; // Just one more 'k' at the end
std::string messageSuffixed = message "\r\n";
const char *buffer = messageSuffixed.c_str();
std::cout << "message: " << message << std::endl;
std::cout << "buffer: " << buffer << std::endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437446.html
