Necesito usar un std::string
para almacenar datos recuperados por fgets()
. Para hacer esto, necesito convertir el char*
valor de retorno de fgets()
a std::string
a store en una matriz. ¿Cómo se puede hacer esto?
262
std::string
tiene un constructor para esto:
const char *s = "Hello, World!";
std::string str(s);
Tenga en cuenta que esta construcción copia en profundidad la lista de caracteres en s
y s
no debe ser nullptr
, o el comportamiento no está definido.
str
es solo un nombre de variable. Podría ser cualquier cosa:S
,abc
,l
,I
,strHelloWorld
. Obviamente, algunas opciones son mejores que otras. Pero para este ejemplostr
es bastante aceptable.Si ya conoce el tamaño del char *, use esto en su lugar
Esto no usa strlen.
EDITAR: Si la variable de cadena ya existe, use asignar ():
fuente
La mayoría de las respuestas hablan sobre la construcción
std::string
.Si ya está construido, solo use el operador de asignación .
fuente
¿Por qué usar
fgets()
cuando estás programando C ++? ¿Por qué nostd::getline()
?fuente
Pásalo a través del constructor:
Puede usar la función string.c_str () para ir al otro lado:
fuente
c_str()
vuelveconst char*
fuente
fuente
Me gustaría mencionar un nuevo método que utiliza el literal definido por el usuario
s
. Esto no es nuevo, pero será más común porque se agregó en la Biblioteca estándar de C ++ 14.En gran medida superfluo en el caso general:
Pero le permite usar auto, también con cadenas anchas:
Y aquí es donde realmente brilla:
fuente
He estado luchando con MSVC2005 para usar el
std::string(char*)
constructor como la respuesta mejor calificada. Como veo esta variante listada como # 4 en http://en.cppreference.com/w/cpp/string/basic_string/basic_string , siempre confiable , creo que incluso un compilador antiguo ofrece esto.¡Me ha llevado tanto tiempo darme cuenta de que este constructor se niega absolutamente a coincidir
(unsigned char*)
como argumento! Recibí estos mensajes de error incomprensibles sobre la falla en la coincidencia con elstd::string
tipo de argumento, que definitivamente no era lo que buscaba. Solo lanzar el argumentostd::string((char*)ucharPtr)
resolvió mi problema ... ¡duh!fuente
fuente
data
permanece sin inicializar (vacío).No estoy seguro de por qué nadie además de Erik mencionó esto, pero de acuerdo con esta página , el operador de asignación funciona bien. No es necesario usar un constructor, .assign () o .append ().
fuente
=
(y+=
). No parece suceder con literales como este, sino solo conchar*
cosas. La cuestión de si tales informes son en realidad fugas se discute aquí . Pero si cambié la asignación adestString = std::string(srcCharPtr);
la valgrind, los informes de fugas desaparecerán. YMMV.Constructs an object of class basic_string and determines its initial string value from the array
. Dice valor y nada sobre buffers o propiedad de punteros.