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?
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.
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);
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()
?
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
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();
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;
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;
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!
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';
char* data;
std::string myString(data);