将char数组缓冲区转换为字符串的好方法?

New*_*lls 8 c++

我对C++比较陌生.最近的赋值要求我将大量的char缓冲区(从结构/套接字等)转换为字符串.我一直在使用以下变体,但它们看起来很尴尬.有没有更好的方法来做这种事情?

#include <iostream>
#include <string>

using std::string;
using std::cout;
using std::endl;


char* bufferToCString(char *buff, int buffSize, char *str)
{
    memset(str, '\0', buffSize + 1);
    return(strncpy(str, buff, buffSize));
}


string& bufferToString(char* buffer, int bufflen, string& str)
{
    char temp[bufflen];

    memset(temp, '\0', bufflen + 1);
    strncpy(temp, buffer, bufflen);

    return(str.assign(temp));
}



int main(int argc, char *argv[])
{
   char buff[4] = {'a', 'b', 'c', 'd'};

   char str[5];
   string str2;

   cout << bufferToCString(buff, sizeof(buff), str) << endl;

   cout << bufferToString(buff, sizeof(buff), str2) << endl;

}
Run Code Online (Sandbox Code Playgroud)

Sim*_*ker 20

鉴于您的输入字符串不是以null结尾,您不应该使用str ...函数.您也不能使用常用的std::string构造函数.但是,您可以使用此构造函数:

std::string str(buffer, buflen):它需要char*一个长度.(实际const char*和长度)

我会避免使用C字符串版本.这会给:

std::string bufferToString(char* buffer, int bufflen)
{
    std::string ret(buffer, bufflen);

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

如果你真的必须使用该C-string版本,可以0在该bufflen位置放置一个(如果可以)或者创建一个缓冲区bufflen+1,然后memcpy将缓冲区放入其中,然后0在结尾处(放置一个bufflen位置).

  • 对于Newton Falls:请注意,如果缓冲区中有任何字符,std :: string(Ch*p,size_type n)将不会停止为空字符; 所有n个字符都将被复制到字符串中. (4认同)

Dav*_*son 5

如果数据缓冲区中可能有空('\0')字符,则您不希望使用空终止操作。

您可以使用采用 char*, length 的构造函数。

char buff[4] = {'a', 'b', 'c', 'd'};
cout << std::string(&buff[0], 4);
Run Code Online (Sandbox Code Playgroud)

或者您可以使用采用范围的构造函数:

cout << std::string(&buff[0], &buff[4]); // end is last plus one
Run Code Online (Sandbox Code Playgroud)

不要将 std::string(buff) 构造函数与上面的 buff[] 数组一起使用,因为它不是以 null 终止的。