QString to char*

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

5

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.

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

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

0

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

0

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

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1