J'ai besoin d'utiliser un std::string
pour 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::string
pour stocker dans un tableau. Comment cela peut-il être fait?
J'ai besoin d'utiliser un std::string
pour 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::string
pour 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 s
et s
ne devrait pas l'être nullptr
, sinon le comportement n'est pas défini.
str
n'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 str
est 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::string
type 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);
data
reste 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.