繁体   English   中英

'\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;
}

我运行,它给了我这样的 output:

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

我运行,它给了我 output:

message: mkdir homework
buffer:

gdb给我这个:

message: "mkdir homework"
buffer: 0x55555556aeb0 ""
  - *buffer: 0 '\000'

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

提前致谢。

(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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM