QString to char*

A9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 411
0

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*?

several
  • Rejestracja: dni
  • Ostatnio: dni
5

Na potrzeby przekazania do argumentu funkcji i jeżeli w QString nie wychodzisz poza UTF8 to można tak

Kopiuj
str.toStdString().c_str();

Jeżeli potrzebujesz kopi, to najpierw size potem bajt po bajcie używając data, wzorując się na dokumentacji.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
4

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 ;:

Kopiuj
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.

Kopiuj
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).

A9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 411
0

@kq: Myślę, że to nie problem, bo w obecnym projekcie ten wskaźnik jest argumentem metody w pewnej mojej klasie.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
0

Dlatego nie nazywam tego rozwiązania błędnym, tylko zwracam uwagę na potencjalną pułapkę ;​)

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0
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 ;:

Kopiuj
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.

Kopiuj
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.