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ć?
262
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ładziestr
jest całkiem do przyjęcia.Jeśli znasz już rozmiar znaku *, użyj go zamiast tego
To nie używa strlen.
EDYCJA: Jeśli zmienna łańcuchowa już istnieje, użyj assign ():
źródło
Większość odpowiedzi mówi o konstruowaniu
std::string
.Jeśli już został zbudowany, wystarczy użyć operatora przypisania .
źródło
fgets()
Po co używać podczas programowania C ++? Dlaczego niestd::getline()
?źródło
Przekaż to przez konstruktor:
Możesz użyć funkcji string.c_str (), aby przejść w drugą stronę:
źródło
c_str()
powracaconst char*
źródło
źródło
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:
Ale pozwala korzystać z auto, również z szerokimi ciągami znaków:
I tutaj naprawdę świeci:
źródło
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 zstd::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!źródło
źródło
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 ().
źródło
=
(i+=
). Wydaje się, że tak się nie dzieje z takimi literałami, ale tylko zchar*
rzeczami. Kwestia, czy takie raporty są rzeczywiście przeciekami, jest omawiana tutaj . Ale jeśli zmieniłem przypisanie dodestString = 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.