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

时间:2009-05-22 02:04:42

标签: 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;

}

7 个答案:

答案 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. 在char *的情况下将长度传递给 方法
  2. 如果char *指向null 你可以终止字符数组 使用一切都为null 字符
  3. for char []你可以使用模板 弄清楚char []
  4. 的大小

    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(缓冲区),长度);