web-dev-qa-db-fra.com

convertir un caractère * en std :: string

Je dois utiliser un std::string pour stocker les données récupérées par fgets(). Pour ce faire, je dois convertir la valeur de retour char* de fgets() en un std::string à stocker dans un tableau. Comment cela peut-il être fait?

213
Jonathan Prior

std::string a un constructeur pour cela:

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

Assurez-vous simplement que votre char * n'est pas NULL, sinon le comportement n'est pas défini.

308
Jesse Beder

Si vous connaissez déjà la taille du caractère *, utilisez plutôt ceci

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

Cela n'utilise pas strlen.

EDIT: Si la variable chaîne existe déjà, utilisez assign ():

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

J'ai besoin d'utiliser std :: string pour stocker les données récupérées par fgets ().

Pourquoi utiliser fgets() lorsque vous programmez C++? Pourquoi pas std::getline()?

28
Paul

La plupart des réponses parlent de constructingstd::string.

Si déjà construit, utilisez simplement l'opérateur d'affectation.

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
20
Atul

Passez le par le constructeur:

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

Vous pouvez utiliser la fonction string.c_str () pour aller dans l'autre sens:

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

Je voudrais mentionner une nouvelle méthode qui utilise le littéral défini par l'utilisateur s. Ce n'est pas nouveau, mais ce sera plus courant car il a été ajouté à la bibliothèque standard C++ 14.

Largement superflu dans le cas général:

string mystring = "your string here"s;

Mais cela vous permet d'utiliser auto, même avec des chaînes larges:

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

Et voici où ça brille vraiment:

string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
3
Erik van Velzen

Je viens juste de me battre avec MSVC2005 pour utiliser le constructeur std::string(char*), tout comme la réponse la mieux notée. Lorsque je vois cette variante répertoriée en tant que # 4 sur Always-Trusted http://en.cppreference.com/w/cpp/string/basic_string/basic_string , je suppose que même un ancien compilateur offre cela.

Il m'a fallu si longtemps pour réaliser que ce constructeur absolu refuse de faire correspondre avec (unsigned char*) comme argument! J'ai reçu ces messages d'erreur incompréhensibles sur l'échec de la correspondance avec le type d'argument std::string, ce qui n'était certainement pas ce que je cherchais. Le simple fait de lancer la dispute avec std::string((char*)ucharPtr) a résolu mon problème ... duh!

0
user1564286

Pas sûr de savoir pourquoi personne d’autre que Erik n’a mentionné cela, mais selon cette page , l’opérateur d’affectation fonctionne parfaitement. Pas besoin d'utiliser un constructeur, .assign () ou .append ().

std::string mystring;
mystring = "This is a test!";   // Assign C string to std:string directly
std::cout << mystring << '\n';
0
Vern Jensen
char* data;
std::string myString(data);
0
Daniel A. White