Próbowałem przekonwertować QString na typ char * za pomocą następujących metod, ale wydaje się, że nie działają.
//QLineEdit *line=new QLineEdit();{just to describe what is line here}
QString temp=line->text();
char *str=(char *)malloc(10);
QByteArray ba=temp.toLatin1();
strcpy(str,ba.data());
Czy możesz wyjaśnić możliwą wadę tej metody lub podać alternatywną metodę?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Odpowiedzi:
Cóż, Qt FAQ mówi:
int main(int argc, char **argv) { QApplication app(argc, argv); QString str1 = "Test"; QByteArray ba = str1.toLocal8Bit(); const char *c_str2 = ba.data(); printf("str2: %s", c_str2); return app.exec(); }
Więc może masz inne problemy. Jak dokładnie to nie działa?
źródło
const char*
ichar*
nie są tego samego typu.const char*
to, co naprawdę można uzyskać. Użytkownik może skopiować dane do buforu z możliwością zapisu.char*
niechar const*
, a Twoja odpowiedź po prostu ignoruje ten fakt bez wzmianki.toLocal8Bit()
?Może
my_qstring.toStdString().c_str();
lub bezpieczniej, jak podkreśla Federico:
std::string str = my_qstring.toStdString(); const char* p = str.c_str();
To dalekie od optymalnego, ale wystarczy.
źródło
toStdString()
zwróć nowystd::string
obiekt, a następnieconst char *
uzyskany zostanie wskaźnik do danych wewnętrznych . Jednak obiekt ciągu znaków jest natychmiast niszczony po tej instrukcji, więc wskaźnik wyniku prawdopodobnie nie ma prawidłowego adresu, jeśli zostanie użyty w kolejnej instrukcji.toStdString()
która jest niebezpieczna; to użycie surowych wskaźników. A dokładniej, użycie surowych wskaźników z obiektów, których zakresy nie są dobrze zrozumiałe.Najłatwiejszym sposobem konwersji QString na char * jest qPrintable (const QString & str) , czyli makro rozwijające się do
str.toLocal8Bit().constData()
.źródło
qPrintable
zwracaconst char*
niechar*
,str.toLocal8Bit().data()
powrócichar*
. 2) Wskaźnik doconst char*
staje się nieważny, gdy tylko trafisz na średnik w instrukcji, w którejqPrintable
został użyty. Więcconst char* c_ptr = s.toLocal8Bit().constData();
nie ma sensu.qPrintable
wyjściu jest gwarantowane zakończenie zerowe?qPrintable()
opisie: "Wskaźnik znaku będzie nieprawidłowy po instrukcji, w której użyto qPrintable ()."Odpowiedź Davida działa dobrze, jeśli używasz jej tylko do wyprowadzania do pliku lub wyświetlania na ekranie, ale jeśli funkcja lub biblioteka wymaga znaku * do analizy, ta metoda działa najlepiej:
// copy QString to char* QString filename = "C:\dev\file.xml"; char* cstr; string fname = filename.toStdString(); cstr = new char [fname.size()+1]; strcpy( cstr, fname.c_str() ); // function that requires a char* parameter parseXML(cstr);
źródło
EDYTOWANO
w ten sposób też działa
QString str ("Something"); char* ch = str.toStdString().C_str();
źródło
std::string
→QString
), a nie to, o co się prosi.Twój ciąg może zawierać znaki inne niż Latin1, co prowadzi do niezdefiniowanych danych. To zależy od tego, co masz na myśli, mówiąc „to nie wydaje się działać”.
źródło
poprawne rozwiązanie wyglądałoby tak
QString k; k = "CRAZYYYQT"; char ab[16]; sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data()) ); sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data())); sprintf(ab,"%s",(const char *)k.toStdString().c_str() ); qDebug()<<"--->"<<ab<<"<---";
źródło
Jeśli twój ciąg zawiera znaki spoza ASCII - lepiej zrobić to w ten sposób:
s.toUtf8().data()
(lubs->toUtf8().data()
)źródło
Jest to realny sposób na użycie std :: vector jako kontenera pośredniego:
QString dataSrc("FooBar"); QString databa = dataSrc.toUtf8(); std::vector<char> data(databa.begin(), databa.end()); char* pDataChar = data.data();
źródło
Qt zapewnia najprostsze API
const char *qPrintable(const QString &str) const char *qUtf8Printable(const QString &str)
Jeśli chcesz, aby wskaźnik danych nie był stały, użyj
źródło