【问题标题】:C++ concatenating an unterminated char* to std::stringC++ 将未终止的 char* 连接到 std::string
【发布时间】:2013-07-25 20:55:43
【问题描述】:

unterminated char* 转换为 std::string 的好方法是什么?例如,在完成以下操作后,

int bytes = recv(_socket, &_recv_buffer, recv_buffer_len, 0)

我有接收缓冲区的地址,以及它包含的字节数,我想将它连接到 std::string。 (FWIW,我不使用多字节字符集。)后备是使 _recv_bufferrecv_buffer_len 大一个字节,并设置 _recv_buffer[bytes ] = '\0',但我想知道是否有不那么草率的方法。

【问题讨论】:

    标签: c++ string character delimiter


    【解决方案1】:

    std::string 有一个 append 方法,它接受一个指向字符串的指针和一个长度:

    string& append (const char* s, size_t n);
    

    为你:

    myString.append(_recv_buffer, bytes);
    

    编者注:注意以_ 开头的标识符。它们保留供实现使用。

    【讨论】:

    • 即使是单个下划线?我不知何故认为这是实例变量的常用约定。有别的吗?
    • 我个人使用单个尾随下划线like_this_
    • 来自规范:“每个以下划线开头的名称都保留给实现,用作全局命名空间中的名称。”
    • 当然,另一个大的赠品是它前面的this-> ... :)
    • @CarlNorum,这意味着如果这些名称不在全局命名空间中,则不会保留这些名称。
    【解决方案2】:

    使用str.append(recv_buffer, bytes); 应该可以解决问题。

    【讨论】:

      【解决方案3】:
      std::string data(&_recv_buffer, &_recv_buffer + bytes);
      

      你确定&_recv_buffer 吗?如果您的缓冲区是 char[] 或类似的,它必须是 _recv_buffer

      【讨论】:

        猜你喜欢
        • 2012-01-10
        • 1970-01-01
        • 2015-03-02
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 2013-01-19
        • 2011-05-26
        • 2011-11-13
        相关资源
        最近更新 更多