Saya mencoba mengonversi QString ke tipe char * dengan metode berikut, tetapi tampaknya tidak berhasil.
//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());
Dapatkah Anda menjelaskan kekurangan yang mungkin terjadi dengan metode ini, atau memberikan metode alternatif?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Jawaban:
Nah, FAQ Qt mengatakan:
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(); }
Jadi mungkin Anda mengalami masalah lain. Bagaimana tepatnya ini tidak berhasil?
sumber
const char*
danchar*
bukan tipe yang sama.const char*
itulah yang benar-benar dapat diperoleh. Pengguna bebas menyalin data ke buffer yang dapat ditulis.char*
, bukanchar const*
, dan jawaban Anda mengabaikan fakta itu tanpa menyebutkan.toLocal8Bit()
?Mungkin
my_qstring.toStdString().c_str();
atau lebih aman, seperti yang ditunjukkan Federico:
std::string str = my_qstring.toStdString(); const char* p = str.c_str();
Ini jauh dari optimal, tetapi akan berhasil.
sumber
toStdString()
kembalikanstd::string
objek baru dan kemudian penunjuk ke data internalconst char *
diperoleh. Namun, objek string segera dimusnahkan setelah pernyataan ini, jadi penunjuk hasil mungkin tidak memiliki alamat yang valid jika Anda menggunakannya dalam pernyataan berikutnya.toStdString()
yang berbahaya; itu penggunaan petunjuk mentah. Atau, lebih khusus lagi, penggunaan pointer mentah dari objek yang cakupannya tidak dipahami dengan baik.Cara termudah untuk mengonversi QString ke char * adalah qPrintable (const QString & str) , yang merupakan perluasan makro
str.toLocal8Bit().constData()
.sumber
qPrintable
kembaliconst char*
tidakchar*
,str.toLocal8Bit().data()
kembalichar*
. 2) Penunjukconst char*
menjadi tidak valid segera setelah Anda menekan titik koma dalam pernyataan tempatqPrintable
digunakan. Jadiconst char* c_ptr = s.toLocal8Bit().constData();
tidak masuk akal.qPrintable
output dijamin nol dihentikan?qPrintable()
deskripsi: "Pointer char tidak akan valid setelah pernyataan di mana qPrintable () digunakan."Jawaban David berfungsi dengan baik jika Anda hanya menggunakannya untuk keluaran ke file atau ditampilkan di layar, tetapi jika fungsi atau pustaka memerlukan karakter * untuk parsing, maka metode ini berfungsi paling baik:
// 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);
sumber
DIEDIT
cara ini juga berhasil
QString str ("Something"); char* ch = str.toStdString().C_str();
sumber
std::string
→QString
), bukan apa yang diminta.String Anda mungkin berisi karakter non Latin1, yang mengarah ke data yang tidak ditentukan. Itu tergantung dari apa yang Anda maksud dengan "sepertinya tidak berhasil".
sumber
Solusi yang Benar Akan seperti ini
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<<"<---";
sumber
Jika string Anda berisi karakter non-ASCII - lebih baik melakukannya dengan cara ini:
s.toUtf8().data()
(ataus->toUtf8().data()
)sumber
Ini adalah cara yang layak untuk menggunakan std :: vector sebagai penampung perantara:
QString dataSrc("FooBar"); QString databa = dataSrc.toUtf8(); std::vector<char> data(databa.begin(), databa.end()); char* pDataChar = data.data();
sumber
Qt menyediakan API paling sederhana
const char *qPrintable(const QString &str) const char *qUtf8Printable(const QString &str)
Jika Anda ingin menggunakan penunjuk data non-const
sumber