Potrzebuję użyć std::string
do przechowywania danych pobranych przez fgets()
. Aby to zrobić, muszę przekonwertować char*
wartość zwracaną z fgets()
na std::string
do przechowywania w tablicy. Jak można to zrobić?
Potrzebuję użyć std::string
do przechowywania danych pobranych przez fgets()
. Aby to zrobić, muszę przekonwertować char*
wartość zwracaną z fgets()
na std::string
do przechowywania w tablicy. Jak można to zrobić?
Odpowiedzi:
std::string
ma do tego konstruktor:
const char *s = "Hello, World!";
std::string str(s);
Zauważ, że ta konstrukcja głęboko kopiuje listę znaków na s
i s
nie powinna być nullptr
, w przeciwnym razie zachowanie jest niezdefiniowane.
str
to tylko nazwa zmiennej. To może być cokolwiek: S
, abc
, l
, I
, strHelloWorld
. Oczywiście niektóre wybory są lepsze niż inne. Ale w tym przykładzie str
jest całkiem do przyjęcia.
Jeśli znasz już rozmiar znaku *, użyj go zamiast tego
char* data = ...;
int size = ...;
std::string myString(data, size);
To nie używa strlen.
EDYCJA: Jeśli zmienna łańcuchowa już istnieje, użyj assign ():
std::string myString;
char* data = ...;
int size = ...;
myString.assign(data, size);
Większość odpowiedzi mówi o konstruowaniu std::string
.
Jeśli już został zbudowany, wystarczy użyć operatora przypisania .
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
Przekaż to przez konstruktor:
const char* dat = "my string!";
std::string my_string( dat );
Możesz użyć funkcji string.c_str (), aby przejść w drugą stronę:
std::string my_string("testing!");
const char* dat = my_string.c_str();
c_str()
powracaconst char*
const char* charPointer = "Hello, World!\n";
std::string strFromChar;
strFromChar.append(charPointer);
std::cout<<strFromChar<<std::endl;
Chciałbym wspomnieć o nowej metodzie, która używa literału zdefiniowanego przez użytkownika s
. To nie jest nowe, ale będzie bardziej powszechne, ponieważ zostało dodane do biblioteki standardowej C ++ 14.
W dużej mierze zbędne w ogólnym przypadku:
string mystring = "your string here"s;
Ale pozwala korzystać z auto, również z szerokimi ciągami znaków:
auto mystring = U"your UTF-32 string here"s;
I tutaj naprawdę świeci:
string suffix;
cin >> suffix;
string mystring = "mystring"s + suffix;
Właśnie walczyłem z MSVC2005, aby używać std::string(char*)
konstruktora tak, jak najwyżej oceniana odpowiedź. Jak widzę ten wariant jest wymieniony jako nr 4 na zawsze zaufanym http://en.cppreference.com/w/cpp/string/basic_string/basic_string , wydaje mi się, że nawet stary kompilator to oferuje.
Tak długo zajęło mi zrozumienie, że ten konstruktor absolutnie nie zgadza się z (unsigned char*)
argumentem! Otrzymałem te niezrozumiałe komunikaty o błędach dotyczące niezgodności z std::string
typem argumentu, co zdecydowanie nie było moim celem. Właśnie rzucając kłótnię std::string((char*)ucharPtr)
rozwiązałem mój problem ... duh!
char* data;
std::string myString(data);
data
pozostaje niezainicjowany (pusty).
Nie jestem pewien, dlaczego nikt oprócz Erika o tym nie wspomniał, ale zgodnie z tą stroną operator przypisania działa dobrze. Nie trzeba używać konstruktora, .assign () ani .append ().
std::string mystring;
mystring = "This is a test!"; // Assign C string to std:string directly
std::cout << mystring << '\n';
=
(i +=
). Wydaje się, że tak się nie dzieje z takimi literałami, ale tylko z char*
rzeczami. Kwestia, czy takie raporty są rzeczywiście przeciekami, jest omawiana tutaj . Ale jeśli zmieniłem przypisanie do destString = std::string(srcCharPtr);
Valgrind, wyciek zniknął. YMMV.
Constructs an object of class basic_string and determines its initial string value from the array
. Mówi wartość i nic o buforach lub własności wskaźnika.