我对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;
}
答案 0 :(得分:18)
鉴于您的输入字符串不是以null结尾,您不应该使用str ...函数。您也无法使用常用的std::string
constructors。但是,您可以使用此构造函数:
std::string str(buffer, buflen)
:它需要char*
和一个长度。 (实际上是const char*
和长度)
我会避免使用C字符串版本。这会给:
std::string bufferToString(char* buffer, int bufflen)
{
std::string ret(buffer, bufflen);
return ret;
}
如果您真的必须使用C-string
版本,请将0
放在bufflen
位置(如果可以)或创建bufflen+1
的缓冲区,然后{ {1}}缓冲区,并在memcpy
位置放置0
。
答案 1 :(得分:2)
如果数据缓冲区中可能包含空('\ 0')字符,则不希望使用以null结尾的操作。
您可以使用带有char *,length。
的构造函数char buff[4] = {'a', 'b', 'c', 'd'};
cout << std::string(&buff[0], 4);
或者您可以使用带范围的构造函数:
cout << std::string(&buff[0], &buff[4]); // end is last plus one
不要将std :: string(buff)构造函数与上面的buff []数组一起使用,因为它不是以null结尾的。
答案 2 :(得分:1)
std :: string to const char *:
my_str.c_str();
char * to std :: string:
string my_str1 ("test");
char test[] = "test";
string my_str2 (test);
甚至
string my_str3 = "test";
答案 3 :(得分:0)
std::string buf2str(const char* buffer)
{
return std::string(buffer);
}
或者只是
std::string mystring(buffer);
答案 4 :(得分:0)
使用带有大小的字符串构造函数:
string ( const char * s, size_t n );
内容被初始化为由第一个n形成的字符串的副本 字符数组中的字符 s指出。
cout << std::string(buff, sizeof(buff)) << endl;
http://www.cplusplus.com/reference/string/string/string/
非空终止缓冲区到C字符串:
memcpy(str, buff, buffSize);
str[bufSize] = 0; // not buffSize+1, because C indexes are 0-based.
答案 5 :(得分:0)
该方法需要知道字符串的大小。你必须要么:
1)示例 - 对于您传递bufflen的情况:
std::string bufferToString(char* buffer, int bufflen)
{
return std::string(buffer, bufflen);
}
2)示例 - 对于缓冲区指向空终止字符数组的情况:
std::string bufferToString(char* buffer)
{
return std::string(buffer);
}
3)示例 - 对于传递char []的情况:
template <typename T, size_t N>
std::string tostr(T (&array)[N])
{
return std::string(array, N);
}
Usage:
char tstr[] = "Test String";
std::string res = tostr(tstr);
std::cout << res << std::endl;
对于前两种情况,您实际上不必创建新方法:
std::string(buffer, bufflen);
std::string(buffer);
答案 6 :(得分:0)
字符串值(reinterpret_cast(缓冲区),长度);