Przeszukałem wiele stron ale pełno tematów miało po kilka lat i pełno rozwiązań z nich nie działało u mnie. Jaki jest najlepszy i najbardziej aktualny sposób na konwersję QStringa do char*?

- Rejestracja:prawie 16 lat
- Ostatnio:około 5 godzin
Na potrzeby przekazania do argumentu funkcji i jeżeli w QString nie wychodzisz poza UTF8 to można tak
str.toStdString().c_str();
Jeżeli potrzebujesz kopi, to najpierw size
potem bajt po bajcie używając data
, wzorując się na dokumentacji.

- Rejestracja:prawie 12 lat
- Ostatnio:2 minuty
- Lokalizacja:Szczecin
Powyższy sposób jest dobry, pod warunkiem, że wykorzystasz ten wskaźnik przed końcem czasu życia obiektu, z którego go otrzymałeś. W powyższym przykładzie jest to ;
:
std::cout << str.toStdString().c_str(); // ok
auto ptr = str.toStdString().c_str();
std::cout << ptr; // UB, wskazuje na reprezentację nieistniejącego obiektu `std::string`
W przeciwnym wypadku musisz własnoręcznie zapewnić odpowiedni czas życia stringa.
auto stdstr = str.toStdString();
auto ptr = stdstr.c_str();
std::cout << ptr; // OK
Swoją drogą, nie wygląda jak by to było Twoim problemem, ale ogólnie warto wziąć też pod uwagę kodowanie. QString
ma sporo różnych funkcji od tego (7, 8, 9, 10, 11).

- Rejestracja:ponad 21 lat
- Ostatnio:dzień
kq napisał(a):
Powyższy sposób jest dobry, pod warunkiem, że wykorzystasz ten wskaźnik przed końcem czasu życia obiektu, z którego go otrzymałeś. W powyższym przykładzie jest to
;
:std::cout << str.toStdString().c_str(); // ok auto ptr = str.toStdString().c_str(); std::cout << ptr; // UB, wskazuje na reprezentację nieistniejącego obiektu `std::string`
Ja bym powiedział, że jedynym bezpiecznym sposobem użycia c_str()
jest używanie go wyłącznie w wywołaniach funkcji, a nie w przypisaniu do zmiennej.
string s = str.toStdString();
jakaś_funkcja_z_C(s.c_str());
w ten sposób nie popełnimy tego błędu.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.