convert a char* to std::string

C++Stdstring

C++ Problem Overview


I need to use an std::string to store data retrieved by fgets(). To do this I need to convert the char* return value from fgets() into an std::string to store in an array. How can this be done?

C++ Solutions


Solution 1 - C++

std::string has a constructor for this:

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

Note that this construct deep copies the character list at s and s should not be nullptr, or else behavior is undefined.

Solution 2 - C++

If you already know size of the char*, use this instead

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

This doesn't use strlen.

EDIT: If string variable already exists, use assign():

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

Solution 3 - C++

Most answers talks about constructing std::string.

If already constructed, just use assignment operator.

std::string oString;
char* pStr;

... // Here allocate and get character string (e.g. using fgets as you mentioned)

oString = pStr; // This is it! It copies contents from pStr to oString

Solution 4 - C++

> I need to use std::string to store data retrieved by fgets().

Why using fgets() when you are programming C++? Why not std::getline()?

Solution 5 - C++

Pass it in through the constructor:

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

You can use the function string.c_str() to go the other way:

std::string my_string("testing!");
const char* dat = my_string.c_str();

Solution 6 - C++

const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;

Solution 7 - C++

char* data;
stringstream myStreamString;
myStreamString << data;
string myString = myStreamString.str();
cout << myString << endl;

Solution 8 - C++

I would like to mention a new method which uses the user defined literal s. This isn't new, but it will be more common because it was added in the C++14 Standard Library.

Largely superfluous in the general case:

string mystring = "your string here"s;

But it allows you to use auto, also with wide strings:

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

And here is where it really shines:

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

Solution 9 - C++

I've just been struggling with MSVC2005 to use the std::string(char*) constructor just like the top-rated answer. As I see this variant listed as #4 on always-trusted http://en.cppreference.com/w/cpp/string/basic_string/basic_string , I figure even an old compiler offers this.

It has taken me so long to realize that this constructor absolute refuses to match with (unsigned char*) as an argument ! I got these incomprehensible error messages about failure to match with std::string argument type, which was definitely not what I was aiming for. Just casting the argument with std::string((char*)ucharPtr) solved my problem... duh !

Solution 10 - C++

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

Solution 11 - C++

Converting from C style string to C++ std string is easier

There is three ways we can convert from C style string to C++ std string

First one is using constructor,

char chText[20] = "I am a Programmer";
// using constructor
string text(chText);

Second one is using string::assign method

// char string
char chText[20] = "I am a Programmer";

// c++ string
string text;

// convertion from char string to c++ string
// using assign function
text.assign(chText);

Third one is assignment operator(=), in which string class uses operator overloading

// char string
char chText[20] = "I am a Programmer";

// c++ string
// convertion from char string to c++ string using assignment operator overloading
string text = chText;

third one can be also write like below -

// char string
char chText[20] = "I am a Programmer";

// c++ string
string text;


// convertion from char string to c++ string
text = chText;

Third one is little straight forward and can be used in both situation

  1. while we are declaring and initializing
  2. while we are assigning multiple times after object creation or initialization

Solution 12 - C++

Not sure why no one besides Erik mentioned this, but according to this page, the assignment operator works just fine. No need to use a constructor, .assign(), or .append().

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJonathan PriorView Question on Stackoverflow
Solution 1 - C++Jesse BederView Answer on Stackoverflow
Solution 2 - C++EugeneView Answer on Stackoverflow
Solution 3 - C++AtulView Answer on Stackoverflow
Solution 4 - C++PaulView Answer on Stackoverflow
Solution 5 - C++James ThompsonView Answer on Stackoverflow
Solution 6 - C++user1629342View Answer on Stackoverflow
Solution 7 - C++PresenView Answer on Stackoverflow
Solution 8 - C++Erik van VelzenView Answer on Stackoverflow
Solution 9 - C++user1564286View Answer on Stackoverflow
Solution 10 - C++Daniel A. WhiteView Answer on Stackoverflow
Solution 11 - C++SHAH MD IMRAN HOSSAINView Answer on Stackoverflow
Solution 12 - C++Vern JensenView Answer on Stackoverflow