J'essayais de convertir un QString en type char * par les méthodes suivantes, mais elles ne semblent pas fonctionner.
//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());
Pouvez-vous expliquer le défaut possible avec cette méthode, ou donner une méthode alternative?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Réponses:
Eh bien, la FAQ Qt dit:
Alors peut-être que vous rencontrez d'autres problèmes. Comment cela ne fonctionne-t-il pas exactement?
la source
const char*
etchar*
ne sont pas du même type.const char*
c'est ce qui peut vraiment être obtenu. L'utilisateur est libre de copier les données dans un tampon inscriptible.char*
, nonchar const*
, et votre réponse ignore tout simplement ce fait sans le mentionner.toLocal8Bit()
?Peut être
my_qstring.toStdString().c_str();
ou plus sûr, comme le souligne Federico:
C'est loin d'être optimal, mais fera le travail.
la source
toStdString()
retournez un nouvelstd::string
objet puis le pointeur vers les données internesconst char *
est obtenu. Toutefois, l'objet chaîne est immédiatement détruit après cette instruction, de sorte que le pointeur de résultat n'a probablement pas d'adresse valide si vous l'utilisez dans une instruction ultérieure.toStdString()
qui est dangereuse; c'est l'utilisation de pointeurs bruts. Ou, plus précisément, l'utilisation de pointeurs bruts à partir d'objets dont les portées ne sont pas bien comprises.Le moyen le plus simple de convertir une QString en char * est qPrintable (const QString & str) , qui est une macro se développant en
str.toLocal8Bit().constData()
.la source
qPrintable
renvoieconst char*
nonchar*
,str.toLocal8Bit().data()
retournechar*
. 2) Le pointeur versconst char*
devient invalide dès que vous appuyez sur un point-virgule dans l'instruction où aqPrintable
été utilisé. Celaconst char* c_ptr = s.toLocal8Bit().constData();
n'a donc aucun sens.qPrintable
sortie est-elle garantie à zéro?qPrintable()
description: "Le pointeur char sera invalide après l'instruction dans laquelle qPrintable () est utilisé."La réponse de David fonctionne bien si vous ne l'utilisez que pour la sortie dans un fichier ou l'affichage à l'écran, mais si une fonction ou une bibliothèque nécessite un char * pour l'analyse, alors cette méthode fonctionne mieux:
la source
ÉDITÉ
cette façon fonctionne aussi
la source
std::string
→QString
), pas à ce qui est demandé.Votre chaîne peut contenir des caractères non Latin1, ce qui conduit à des données non définies. Cela dépend de ce que vous entendez par «ça ne semble pas fonctionner».
la source
la bonne solution serait comme ça
la source
Si votre chaîne contient des caractères non ASCII, il est préférable de le faire de cette façon:
s.toUtf8().data()
(ous->toUtf8().data()
)la source
C'est un moyen viable d'utiliser std :: vector comme conteneur intermédiaire:
la source
Qt fournit l'API la plus simple
Si vous souhaitez utiliser un pointeur de données non const
la source