Konwersja AnsiString na char* i odwrotnie
Wielu początkujących programistów w C++ ma problem z zamianą tych dwóch ciągów. Również osoby przesiadające się z Pascala na C++ zniechęca bardziej skomplikowana obsługa ciągów.
Niewątpliwie wygodniejszy z tych dwóch typów jest AnsiString (oraz lepszy std::string), będący odpowiednikiem typu String z Pascala. Za wyborem tego typu przemawia choćby możliwość łatwego łączenia ciągów na zasadzie
co w przypadku char* raczej nie przejdzie. Z drugiej strony, wiele funkcji systemowych (np. fopen()) przyjmuje jako parametr właśnie tablicę znaków.
Alternatywnie - klasa AnsiString udostępnia funkcję printf(). Piszemy zatem:
Niewątpliwie wygodniejszy z tych dwóch typów jest AnsiString (oraz lepszy std::string), będący odpowiednikiem typu String z Pascala. Za wyborem tego typu przemawia choćby możliwość łatwego łączenia ciągów na zasadzie
ansistring3 = ansistring1+ansistring2;
co w przypadku char* raczej nie przejdzie. Z drugiej strony, wiele funkcji systemowych (np. fopen()) przyjmuje jako parametr właśnie tablicę znaków.
Konwersja AnsiString na char*
Klasa AnsiString udostępnia nam funkcję c_str() zwracającą wskaźnik do tablicy typu char. Zatem wykorzystujemy taki kod:AnsiString ciag = "to jest jakiś ciąg"; char* tablica = ciag.c_str();
Konwersja char* na AnsiString
Typ char* możemy bez problemu zrzutować na AnsiString.char* tablica = "to jest jeszcze inny ciąg"; AnsiString ciag; ciag = tablica;
Alternatywnie - klasa AnsiString udostępnia funkcję printf(). Piszemy zatem:
char* tablica = "to jest jeszcze inny ciąg"; AnsiString ciag; ciag.printf(tablica);
std::string ma więcej funkcji, ale rzutowanie go na char* jest trochę bardziej skomplikowane:
char* tablica = const_cast <char*> (ciag.c_str()); // gdy ciag to std::string
poza tym trzeba dokładać dodatkowego include'a (#include <string>), a ponadto nie daje się go bezpośrednio zrzutować na AnsiString, co powoduje, że w wywołaniach systemowych (np. ShowMessage(AnsiString s)) trzeba przekazywać tablicę (za pomocą ShowMessage (ciag.c_str());).
A tak poza tym, to faktycznie, std::string jest lepszy