Jaki jest najlepszy sposób przekonwertowania łańcucha w stylu C na C++ std::string
? W przeszłości robiłem to przy użyciu stringstream
s. Czy istnieje lepszy sposób?Przekształcanie łańcucha znaków w stylu C w std :: string
Odpowiedz
C++ ciągi mieć konstruktora, który umożliwia konwertowanie ciągów C-style:
char* myStr = "This is a C string!";
std::string myCppString = myStr;
i teraz też muszę zrobić "delete myStr;' no? –
@BarnabasSzabolcs Nie, to nie jest konieczne. Trzeba tylko usunąć pamięć przydzieloną za pomocą nowego. Wskaźniki do literałów ciągowych nie wymagają deallocacji. – templatetypedef
Rozumiem, więc zgaduję, że string, tworzy wewnętrzną kopię tego znaku *. –
można zainicjalizować std::string
bezpośrednio z c-string:
std::string s = "i am a c string";
std::string t = std::string("i am one too");
Sprawdź różnych konstruktorów klasa ciągów: documentation Być może zainteresuje Cię:
//string(char* s)
std::string str(cstring);
I:
//string(char* s, size_t n)
std::string str(cstring, len_str);
Jeśli masz na myśli char*
do std::string
można użyć konstruktora.
char* a;
std::string s(a);
Albo jeśli string s
już istnieje, po prostu napisać to:
s=std::string(a);
Nie. Twój przykład spowodowałby błąd logiczny w konstruktorze std :: string. "a" nie może być NULL. –
w ogóle (bez deklarowania nowy magazyn) można po prostu użyć 1-Arg konstruktora zmienić C-łańcuch znaków na ciąg RValue:
string xyz = std::string("this is a test") +
std::string(" for the next 60 seconds ") +
std::string("of the emergency broadcast system.");
jednak to nie działa przy konstruowaniu ciąg przekazać je poprzez odniesienie do funkcji (problem po prostu wpadł), np
void ProcessString(std::string& username);
ProcessString(std::string("this is a test")); // fails
Musisz zrobić odniesienie const odniesienia:
void ProcessString(const std::string& username);
ProcessString(std::string("this is a test")); // works.
C++11
: przeciążenie operatora ciągiem znaków
std::string operator ""_s(const char * str, std::size_t len) {
return std::string(str, len);
}
auto s1 = "abc\0\0def"; // C style string
auto s2 = "abc\0\0def"_s; // C++ style std::string
C++14
: użyć operatora z std::string_literals
nazw
using namespace std::string_literals;
auto s3 = "abc\0\0def"s; // is a std::string
Co to jest CST? Masz na myśli "CString" z MFC? Lub tablica znaków zakończona znakiem NUL (ciąg znaków C)? Albo coś innego? –