Ich habe versucht, einen QString mit den folgenden Methoden in den Typ char * zu konvertieren, aber sie scheinen nicht zu funktionieren.
//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());
Können Sie den möglichen Fehler mit dieser Methode erläutern oder eine alternative Methode angeben?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Antworten:
Nun, die Qt FAQ sagt:
Vielleicht haben Sie andere Probleme. Wie genau funktioniert das nicht?
quelle
const char*
undchar*
sind nicht der gleiche Typ.const char*
kann man natürlich wirklich etwas erreichen. Dem Benutzer steht es frei, die Daten in einen beschreibbaren Puffer zu kopieren.char*
nichtchar const*
, und Ihre Antwort ignoriert diese Tatsache einfach ohne Erwähnung.toLocal8Bit()
?Vielleicht
my_qstring.toStdString().c_str();
oder sicherer, wie Federico betont:
Es ist alles andere als optimal, wird aber die Arbeit erledigen.
quelle
toStdString()
Geben Sie ein neuesstd::string
Objekt zurück und der Zeiger auf interne Datenconst char *
wird abgerufen. Das Zeichenfolgenobjekt wird jedoch sofort nach dieser Anweisung zerstört, sodass der Ergebniszeiger wahrscheinlich keine gültige Adresse hat, wenn Sie ihn in einer nachfolgenden Anweisung verwenden.toStdString()
, die gefährlich ist; Es ist die Verwendung von rohen Zeigern. Oder genauer gesagt, die Verwendung von Rohzeigern von Objekten, deren Bereiche nicht gut verstanden werden.Der einfachste Weg, einen QString in char * zu konvertieren , ist qPrintable (const QString & str) , ein Makro, das auf erweitert wird
str.toLocal8Bit().constData()
.quelle
qPrintable
kehrtconst char*
nichtchar*
,str.toLocal8Bit().data()
kehrtchar*
. 2) Der Zeiger aufconst char*
wird ungültig, sobald Sie ein Semikolon in der Anweisung drücken, in der erqPrintable
verwendet wurde. Machtconst char* c_ptr = s.toLocal8Bit().constData();
also keinen Sinn.qPrintable
Ausgabe garantiert mit Null abgeschlossen?qPrintable()
Beschreibung gewarnt : "Der Zeichenzeiger ist nach der Anweisung, in der qPrintable () verwendet wird, ungültig."Davids Antwort funktioniert einwandfrei, wenn Sie sie nur zum Ausgeben in eine Datei oder zum Anzeigen auf dem Bildschirm verwenden. Wenn für eine Funktion oder Bibliothek jedoch ein Zeichen * zum Parsen erforderlich ist, funktioniert diese Methode am besten:
quelle
BEARBEITET
Dieser Weg funktioniert auch
quelle
std::string
→QString
), nicht nach dem, was verlangt wird.Ihre Zeichenfolge kann Nicht-Latin1-Zeichen enthalten, was zu undefinierten Daten führt. Es hängt davon ab, was Sie unter "es scheint nicht zu funktionieren" verstehen.
quelle
Die richtige Lösung wäre so
quelle
Wenn Ihre Zeichenfolge Nicht-ASCII-Zeichen enthält, ist es besser, dies folgendermaßen zu tun:
s.toUtf8().data()
(oders->toUtf8().data()
)quelle
Es ist eine praktikable Möglichkeit, std :: vector als Zwischencontainer zu verwenden:
quelle
Qt bietet die einfachste API
Wenn Sie einen nicht konstanten Datenzeiger verwenden möchten
quelle