Necesito usar un std::stringpara almacenar datos recuperados por fgets(). Para hacer esto, necesito convertir el char*valor de retorno de fgets()a std::stringa 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 sy sno debe ser nullptr, o el comportamiento no está definido.
stres 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 ejemplostres 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::stringtipo de argumento, que definitivamente no era lo que buscaba. Solo lanzar el argumentostd::string((char*)ucharPtr)resolvió mi problema ... ¡duh!fuente
fuente
datapermanece 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.