QString to char*

QString to char*
A9
  • Rejestracja:prawie 9 lat
  • Ostatnio:około miesiąc
  • Postów:408
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:prawie 16 lat
  • Ostatnio:około 5 godzin
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.


edytowany 3x, ostatnio: several
A9
No i na tym poście można skończyć ten temat. Wszystko działa dobrze, dzięki :)
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • 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).


several
Właśnie dlatego napisałem "na potrzeby przekazania do argumentu funkcji" w pierwszym zdaniu.
kq
Wiem, tylko rozszerzyłem Twoją wypowiedź o wyjaśnienie dlaczego tak się dzieje ;​)
several
Ah, no tak. Jeszcze nie dokończyłem kawy to wolniej myśle ;)
A9
  • Rejestracja:prawie 9 lat
  • Ostatnio:około miesiąc
  • Postów:408
0

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

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Szczecin
0

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


Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
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.

edytowany 1x, ostatnio: Azarien

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.