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*?
QString to char*
- Rejestracja: dni
- Ostatnio: dni
- Postów: 411
- Rejestracja: dni
- Ostatnio: dni
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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
- Lokalizacja: Szczecin
Dlatego nie nazywam tego rozwiązania błędnym, tylko zwracam uwagę na potencjalną pułapkę ;)
- Rejestracja: dni
- Ostatnio: dni
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.