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?
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?
Respuestas:
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 ejemplo str
es bastante aceptable.
Si ya conoce el tamaño del char *, use esto en su lugar
char* data = ...;
int size = ...;
std::string myString(data, size);
Esto no usa strlen.
EDITAR: Si la variable de cadena ya existe, use asignar ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
La mayoría de las respuestas hablan sobre la construcción std::string
.
Si ya está construido, solo use el operador de asignación .
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
Pásalo a través del constructor:
const char* dat = "my string!";
std::string my_string( dat );
Puede usar la función string.c_str () para ir al otro lado:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
vuelveconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
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:
string mystring = "your string here"s;
Pero le permite usar auto, también con cadenas anchas:
auto mystring = U"your UTF-32 string here"s;
Y aquí es donde realmente brilla:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
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 el std::string
tipo de argumento, que definitivamente no era lo que buscaba. Solo lanzar el argumento std::string((char*)ucharPtr)
resolvió mi problema ... ¡duh!
char* data;
std::string myString(data);
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 ().
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(y +=
). No parece suceder con literales como este, sino solo con char*
cosas. La cuestión de si tales informes son en realidad fugas se discute aquí . Pero si cambié la asignación a destString = 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.