将char数组缓冲区转换为字符串的好方法?
我对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;
}
鉴于你的输入字符串不是空终止的,你不应该使用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
版本,无论是在bufflen
位置掉落0
(如果可以的话),或创建一个缓冲的bufflen+1
,然后memcpy
缓冲成这样了,落个0
结尾(bufflen
位置)。
的std :: string为const char *:
my_str.c_str();
的char *到的std :: string:
string my_str1 ("test");
char test[] = "test";
string my_str2 (test);
甚至
string my_str3 = "test";
std::string buf2str(const char* buffer)
{
return std::string(buffer);
}
Ø r只是
std::string mystring(buffer);
我一直在寻找一种更简洁的方式来添加一个终止的null,以便像这样的东西能正常工作。 – 2009-05-22 02:21:40
如果数据缓冲区中可能有空('\ 0')字符,则不需要使用以空值终止的操作。
您可以使用带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
请勿使用的buff []数组以上的的std :: string(BUFF)构造函数,因为它不是空封端的。
使用字符串构造函数的大小:
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.
的方法需要知道字符串的大小。你必须要么:
- 在字符的情况下,*传递长度 方法
- 在字符的情况下,*指向空 终止字符数组,你可以 使用了一切为null 字符
- 对于char []您可以使用模板 弄不清的char []
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);
字符串值(reinterpret_cast(buffer),length);
问题是缓冲区没有终止空值。 – 2009-05-22 02:20:22
使用常量字符串初始化char数组时,它会得到一个终止的空值。当你使用string :: c_str()时,你也会得到一个终止的null。我不明白你的投诉是什么。 – 2009-05-22 02:27:56
答案中的代码是正确的,但与问题不同。 “char buff [4] = {'a','b','c','d'};”不会给你一个以null结尾的字符串。 – markh44 2009-05-22 08:02:32