我对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位置).
如果数据缓冲区中可能有空('\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 终止的。