2009-05-22 53 views
5

我对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; 

} 

回答

15

鉴于你的输入字符串不是空终止的,你不应该使用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位置)。

1

的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"; 
+0

问题是缓冲区没有终止空值。 – 2009-05-22 02:20:22

+0

使用常量字符串初始化char数组时,它会得到一个终止的空值。当你使用string :: c_str()时,你也会得到一个终止的null。我不明白你的投诉是什么。 – 2009-05-22 02:27:56

+0

答案中的代码是正确的,但与问题不同。 “char buff [4] = {'a','b','c','d'};”不会给你一个以null结尾的字符串。 – markh44 2009-05-22 08:02:32

0
std::string buf2str(const char* buffer) 
{ 
    return std::string(buffer); 
} 

Ø r只是

std::string mystring(buffer); 
+0

我一直在寻找一种更简洁的方式来添加一个终止的null,以便像这样的东西能正常工作。 – 2009-05-22 02:21:40

1

如果数据缓冲区中可能有空('\ 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)构造函数,因为它不是空封端的。

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. 
0

的方法需要知道字符串的大小。你必须要么:

  1. 在字符的情况下,*传递长度 方法
  2. 在字符的情况下,*指向空 终止字符数组,你可以 使用了一切为null 字符
  3. 对于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); 
0

字符串值(reinterpret_cast(buffer),length);

相关问题