'\\r\n'当长度过长时,删除整个缓冲区



我正在学习套接字编程,我的项目中要求在每个返回的消息中放入rn。我注意到,当rn超过一定数量的字符时,它会删除整个缓冲区。例如,我有一个这样的代码:

#include <iostream>
int main()
{
std::string message = "mkdir homewor";
const char *buffer = (message + "rn").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 homeworrn"
- *buffer: 109 'm'

这是我所期待的。

但当消息太长,我将其转换为C字符串时,整个缓冲区就会被删除。例如:

#include <iostream>
int main()
{
std::string message = "mkdir homework"; // Just one more 'k' at the end
const char *buffer = (message + "rn").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 '00'

还有一个观察结果是,如果消息的长度超过了第二个例子中的消息长度,那么缓冲区无论如何都会被删除。有人能告诉我这个问题是什么吗?我无法摆脱rn,因为它在项目中是必需的。

提前谢谢。

(message + "rn")创建一个新的std::字符串,并用一个指针支持它。这个新的std::字符串将在完整表达式的末尾被销毁。

所以你应该这样做,

#include <iostream>
int main()
{
std::string message = "mkdir homework"; // Just one more 'k' at the end
std::string messageSuffixed = message + "rn";
const char *buffer = messageSuffixed.c_str();
std::cout << "message: " << message << std::endl;
std::cout << "buffer: " << buffer << std::endl;
}

相关内容

  • 没有找到相关文章

最新更新