将char *转换为std :: string

我需要使用std::string来存储由fgets()检索的数据。 为此,我需要将fgets() char*输出转换为一个std::string来存储在一个数组中。 如何才能做到这一点?

std::string有一个这样的构造函数:

 const char *s = "Hello, World!"; std::string str(s); 

只要确保你的char *不是NULL ,否则行为是未定义的。

如果你已经知道了char *的大小,那就用这个

 char* data = ...; int size = ...; std::string myString(data, size); 

这不使用strlen。

编辑:如果stringvariables已经存在,使用assign():

 std::string myString; char* data = ...; int size = ...; myString.assign(data, size); 

我需要使用std :: string来存储由fgets()检索的数据。

为什么在编程C ++时使用fgets() ? 为什么不std::getline()

大多数答案都是关于构造 std::string

如果已经构build, 只需使用赋值运算符

 std::string oString; char* pStr; ... // Here allocate and get character string (eg using fgets as you mentioned) oString = pStr; // This is it! It copies contents from pStr to oString 

通过构造函数传入:

 const char* dat = "my string!"; std::string my_string( dat ); 

你可以使用函数string.c_str()去另一种方式:

 std::string my_string("testing!"); const char* dat = my_string.c_str(); 
 const char* charPointer = "Hello, World!\n"; std::string strFromChar; strFromChar.append(charPointer); std::cout<<strFromChar<<std::endl; 
 char* data; stringstream myStreamString; myStreamString << data; string myString = myStreamString.str(); cout << myString << endl; 

我想提一个使用用户定义文字s新方法。 这不是新的,但它会更常见,因为它是在C ++ 14标准库中添加的。

在一般情况下大多是多余的:

 string mystring = "your string here"s; 

但它允许你使用自动,也与宽string:

 auto mystring = U"your UTF-32 string here"s; 

这里是真正闪耀的地方:

 string suffix; cin >> suffix; string mystring = "mystring"s + suffix; 

我刚刚与MSVC2005苦苦挣扎,使用std::string(char*)构造函数就像顶级答案一样。 正如我看到这个变种列在总是受信任的http://en.cppreference.com/w/cpp/string/basic_string/basic_string#4 ,我甚至认为,一个旧的编译器提供了这个。

我花了这么长时间才意识到,这个构造函数绝对拒绝匹配(unsigned char*)作为参数! 我得到了这些令人难以理解的错误信息,无法匹配std::string参数types,这绝对不是我想要的。 只需使用std::string((char*)ucharPtr)来parsing我的问题…呃!

 char* data; std::string myString(data); 

不知道为什么除了Erik没有人提到这个,但根据这个页面 ,赋值运算符工作得很好。 不需要使用构造函数,.assign()或.append()。

 std::string mystring; mystring = "This is a test!"; // Assign C string to std:string directly std::cout << mystring << '\n';