Propre façon de convertir QString char * (non const char* !!!!)
J'ai une vilaine code pour ce genre de choses (créer un pointeur de char du c et de copier le QString) mais peut-être ... existent dans QT est une manière élégante ...
code :
QString maquina is a method parameter.
char *c_maquina = new char[maquina.length() + 1];
strcpy(c_maquina, maquina.toStdString().c_str());
juste pour information j'ai besoin d'un VRAI char* et non un simple const char* donc, ce code ne fonctionne pas :
idMaquina.toLatin1().data();
Je ne peux pas utiliser http://developer.qt.nokia.com/faq/answer/how_can_i_convert_a_qstring_to_char_and_vice_versa
"Je ne peux pas utiliser le lien" -- pourquoi est-ce que le lien n'est pas utilisable? Vous devez être plus clair. Expliquer non seulement le problème avec votre plan (obtenir une
Yakk, je ne peux pas utiliser convertir comme expliquer dans le lien parce que c'est une conversion entre un QString et un char* (sans possibilité de remplacer le char*).j'ai besoin d'un char* avec posible remplacer, je l'espère, un QString fonction pour cette... merci pour votre commentaire.
Je ne sais toujours pas pourquoi vous ne pouvez pas utiliser liés solution. Le problème est que l'exemple de code utilise
parce que mon code appel d'une bibliothèque c et la réponse est vide lors de l'utilisation d'un const char* ou lors de l'utilisation d'un .de données() directement, comme l'exemple de la liaison.je ne peux pas modifier le code de la bibliothèque c (interne au système du client....)
et ce qui ne le C de la bibliothèque avec la
char*
à partir d'un QString
), mais ce qui vous a amené à penser que vous besoin.Yakk, je ne peux pas utiliser convertir comme expliquer dans le lien parce que c'est une conversion entre un QString et un char* (sans possibilité de remplacer le char*).j'ai besoin d'un char* avec posible remplacer, je l'espère, un QString fonction pour cette... merci pour votre commentaire.
Je ne sais toujours pas pourquoi vous ne pouvez pas utiliser liés solution. Le problème est que l'exemple de code utilise
const char*
et pas char*
? .data()
renvoie une char*
. En outre, qu'espérez-vous faire avec l'écriture char*
?parce que mon code appel d'une bibliothèque c et la réponse est vide lors de l'utilisation d'un const char* ou lors de l'utilisation d'un .de données() directement, comme l'exemple de la liaison.je ne peux pas modifier le code de la bibliothèque c (interne au système du client....)
et ce qui ne le C de la bibliothèque avec la
char*
? Tout simplement "faire une char*
" de ne pas répondre à votre problème. Espérez-vous obtenir les données de la fonction C? N'y a aucune façon de savoir comment long les données qu'il va vous donner de l'est? Veuillez fournir la signature de la fonction que vous essayez d'appeler.OriginalL'auteur Gilles Grandguillaume | 2013-07-29
Vous devez vous connecter pour publier un commentaire.
C'est simple:
Vous pouvez également utiliser
toLatin1
outoUtf8
au lieu detoLocal8Bit
. Notez qu'aucun des deux ne peut être mis en file d'attente avecdata
appel. EttoStdString().c_str()
est pas valide. C'est parce que toutQByteArray
oustd::string
produits de manière temporaire et sera détruit immédiatement détruire char tampon avec elle. Vous avez besoin de stockerQByteArray
dans une variable locale lors de l'utilisation de la mémoire tampon.Également noter que Qt fournit
QByteArray
classe de traiter des tableaux de char. En général, il n'est pas nécessaire d'utiliserchar*
, vous pouvez faire presque n'importe quoi avecQByteArray
.vous avez raison Riateche! j'ai besoin de toujours utiliser un local QByteArray ! désolé im noob en c++ c'est mon premier projet .....
OriginalL'auteur Pavel Strakhov
Je pense que la solution dépend du type de caractères à convertir, et si un style C de la fonction avec "char *" les arguments de type doit être intégrée de l'appelé.
Si plusieurs solutions peuvent être utilisées pour votre cas spécifique, leurs niveaux d'efficacité peut être légèrement différente, que je n'ai pas testé.
Le programme de test suivant montre comment utiliser ces solutions:
Le code ci-dessus a été testé à l'aide de Qt 5.4 pour Linux.
Un deuxième sujet impliqué dans cette question est de savoir si nous pouvons fonctions de la chaîne d'ensemble au cours de cette 2-l'étape de processus de conversion:
<myQString>.to<AnotherClass>().<getCPointer>(); //OK or not?
Je pense que cela dépend "AnotherClass" et sur le type de caractères à convertir. Basé sur une documentation sur QString, QByteArray et std::string, il apparaît qu'il est sûr d'écrire:
<myQString>.toStdString().c_str(); //OK.
<myQString>.toUtf8().data(); //Should be OK as QString is Unicode string.
Mais les lignes suivantes doivent être évités:
<myQString>.toLocal8Bit().data(); //May crash if the converted QByteArray object is undefined !
<myQString>.toLatin1().data(); //May crash if the converted QByteArray object is undefined !
OriginalL'auteur jonathanzh
QString::toLatin1().de données() vous donne un const char*, car il vous donne la mémoire tampon interne. La raison, c'est const est parce que vous n'êtes pas censé modifier.
Donc, si vous souhaitez le modifier, vous devez copier que les données à un autre tampon... comme celui que vous venez de alloués à l'aide de (nouveaux).
OriginalL'auteur inetknght
std::vector<char>
? C'est une drôle de façon de direstd::string
.Trop compliqué et non-Qt façon de faire la chose.
Un
string
est une séquence dechar
de sens (via le char traits). Unvector<char>
est un tampon dechar
morceaux de taille avec pas construit dans ce sens. L'op voulait un tampon, aussi loin que je pouvais dire.OriginalL'auteur Yakk - Adam Nevraumont
QByteArray contient un non const version de
data()
. Voir:http://qt-project.org/doc/qt-5.0/qtcore/qbytearray.html#data
OriginalL'auteur fjardon
Je l'utiliser dans mon code tout le temps
OriginalL'auteur Jacob Ramey
Parfois, il n'y a simplement aucun moyen de garder votre code en haut de la beauté. Traiter avec elle. Vous pouvez l'envelopper dans un peu de fonction auxiliaire, prise de QString en paramètre et retournant char*, si vous voulez vraiment.
OriginalL'auteur Xirdus