J'ai besoin d'utiliser un std::stringpour stocker les données récupérées par fgets(). Pour ce faire, je dois convertir la char*valeur de retour de fgets()en un std::stringpour stocker dans un tableau. Comment cela peut-il être fait?
J'ai besoin d'utiliser un std::stringpour stocker les données récupérées par fgets(). Pour ce faire, je dois convertir la char*valeur de retour de fgets()en un std::stringpour stocker dans un tableau. Comment cela peut-il être fait?
Réponses:
std::string a un constructeur pour cela:
const char *s = "Hello, World!";
std::string str(s);
Notez que cette construction copie en profondeur la liste des caractères dans set sne devrait pas l'être nullptr, sinon le comportement n'est pas défini.
strn'est qu'un nom de variable. Il pourrait être quelque chose: S, abc, l, I, strHelloWorld. Évidemment, certains choix sont meilleurs que d'autres. Mais pour cet exemple strest tout à fait acceptable.
Si vous connaissez déjà la taille du caractère *, utilisez-le à la place
char* data = ...;
int size = ...;
std::string myString(data, size);
Cela n'utilise pas de strlen.
EDIT: Si la variable chaîne existe déjà, utilisez assign ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
La plupart des réponses parlent de construction std::string .
S'il est 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 via 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();
c_str()retoursconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::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é dans 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, également avec des chaînes larges:
auto mystring = U"your UTF-32 string here"s;
Et c'est là que ça brille vraiment:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Je viens de me battre avec MSVC2005 pour utiliser le std::string(char*)constructeur comme la réponse la mieux notée. Comme je vois cette variante répertoriée comme # 4 sur http://en.cppreference.com/w/cpp/string/basic_string/basic_string toujours fiable , je pense que même un ancien compilateur offre cela.
Il m'a fallu si longtemps pour réaliser que ce constructeur absolu refuse de correspondre avec (unsigned char*)comme argument! J'ai reçu ces messages d'erreur incompréhensibles sur l'échec de la correspondance avec le std::stringtype d'argument, ce qui n'était certainement pas ce que je visais. Le simple fait de lancer l'argument a std::string((char*)ucharPtr)résolu mon problème ... duh!
char* data;
std::string myString(data);
datareste non initialisé (vide).
Je ne sais pas pourquoi personne à part Erik n'a mentionné cela, mais selon cette page , l'opérateur d'affectation fonctionne très bien. 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';
=(et +=). Cela ne semble pas se produire avec des littéraux comme celui-ci, mais seulement avec des char*choses. La question de savoir si de tels rapports sont réellement des fuites est discutée ici . Mais si je modifiais l'attribution aux destString = std::string(srcCharPtr);rapports de fuite de Valgrind, ils disparaissaient. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array. Il indique la valeur et rien sur les tampons ou la propriété du pointeur.