'\r\n' 当长度太长时删除整个缓冲区
'\r\n' deletes the whole buffer when the length is too long
我正在学习套接字编程,我的项目要求在每条返回的消息中放入 \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 字符串时,整个缓冲区都被删除了。例如:
#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;
}
I 运行 它给了我输出:
message: mkdir homework
buffer:
gdb
给我这个:
message: "mkdir homework"
buffer: 0x55555556aeb0 ""
- *buffer: 0 '[=16=]0'
再观察一个例子,如果消息有或者超过了第二个例子中消息的长度,不管怎样都会删除buffer。谁能告诉我这是什么问题?我无法摆脱 \r\n
因为它在项目中是必需的。
提前致谢。
(message + "\r\n")
创建一个新的 std::string,并且它由一个指针支持。
这个新的 std::string 将在 full-expression 结束时被销毁。
所以你应该这样做,
#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;
}
我正在学习套接字编程,我的项目要求在每条返回的消息中放入 \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 字符串时,整个缓冲区都被删除了。例如:
#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;
}
I 运行 它给了我输出:
message: mkdir homework
buffer:
gdb
给我这个:
message: "mkdir homework"
buffer: 0x55555556aeb0 ""
- *buffer: 0 '[=16=]0'
再观察一个例子,如果消息有或者超过了第二个例子中消息的长度,不管怎样都会删除buffer。谁能告诉我这是什么问题?我无法摆脱 \r\n
因为它在项目中是必需的。
提前致谢。
(message + "\r\n")
创建一个新的 std::string,并且它由一个指针支持。
这个新的 std::string 将在 full-expression 结束时被销毁。
所以你应该这样做,
#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;
}