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?
262
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 exemplestr
est tout à fait acceptable.Si vous connaissez déjà la taille du caractère *, utilisez-le à la place
Cela n'utilise pas de strlen.
EDIT: Si la variable chaîne existe déjà, utilisez assign ():
la source
La plupart des réponses parlent de construction
std::string
.S'il est déjà construit, utilisez simplement l'opérateur d'affectation .
la source
Pourquoi utiliser
fgets()
lorsque vous programmez C ++? Pourquoi ne passtd::getline()
?la source
Passez-le via le constructeur:
Vous pouvez utiliser la fonction string.c_str () pour aller dans l'autre sens:
la source
c_str()
retoursconst char*
la source
la source
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:
Mais cela vous permet d'utiliser auto, également avec des chaînes larges:
Et c'est là que ça brille vraiment:
la source
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 lestd::string
type d'argument, ce qui n'était certainement pas ce que je visais. Le simple fait de lancer l'argument astd::string((char*)ucharPtr)
résolu mon problème ... duh!la source
la source
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 ().
la source
=
(et+=
). Cela ne semble pas se produire avec des littéraux comme celui-ci, mais seulement avec deschar*
choses. La question de savoir si de tels rapports sont réellement des fuites est discutée ici . Mais si je modifiais l'attribution auxdestString = 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.