Eu estava tentando converter um QString para o tipo char * pelos seguintes métodos, mas eles não parecem funcionar.
//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());
Você pode elaborar a possível falha desse método ou fornecer um método alternativo?
QString s("some"); printf(reinterpret_cast<char *>(s.data()));
Respostas:
Bem, o Qt FAQ diz:
Então, talvez você esteja tendo outros problemas. Como exatamente isso não funciona?
fonte
const char*
echar*
não são do mesmo tipo.const char*
é claro que é o que realmente pode ser obtido. O usuário está livre para copiar os dados para um buffer gravável.char*
, nãochar const*
, e sua resposta simplesmente ignora esse fato sem mencionar.toLocal8Bit()
?Talvez
my_qstring.toStdString().c_str();
ou mais seguro, como Federico aponta:
Está longe de ser o ideal, mas fará o trabalho.
fonte
toStdString()
retorna um novostd::string
objeto e então o ponteiro para os dados internosconst char *
é obtido. No entanto, o objeto string é destruído imediatamente após essa instrução, portanto, o ponteiro do resultado provavelmente não terá um endereço válido se você usá-lo em uma instrução subsequente.toStdString()
que é perigoso; é o uso de ponteiros brutos. Ou, mais especificamente, o uso de ponteiros brutos de objetos cujos escopos não são bem compreendidos.A maneira mais fácil de converter um QString em char * é qPrintable (const QString & str) , que é uma macro que se expande para
str.toLocal8Bit().constData()
.fonte
qPrintable
retornaconst char*
nãochar*
,str.toLocal8Bit().data()
retornoschar*
. 2) O ponteiro paraconst char*
torna - se inválido assim que você atinge um ponto-e-vírgula na instrução em queqPrintable
foi usado. Entãoconst char* c_ptr = s.toLocal8Bit().constData();
não faz sentido.qPrintable
saída é garantida como terminada em zero?qPrintable()
descrição: "O ponteiro char será inválido após a instrução em que qPrintable () é usado."A resposta de David funciona bem se você estiver usando apenas para enviar para um arquivo ou exibir na tela, mas se uma função ou biblioteca requer um char * para análise, então este método funciona melhor:
fonte
EDITADO
dessa forma também funciona
fonte
std::string
→QString
), não o que foi pedido.Sua string pode conter caracteres não Latin1, o que leva a dados indefinidos. Depende do que você quer dizer com "parece não funcionar".
fonte
a solução correta seria assim
fonte
Se sua string contém caracteres não ASCII - é melhor fazer desta forma:
s.toUtf8().data()
(ous->toUtf8().data()
)fonte
É uma maneira viável de usar std :: vector como um contêiner intermediário:
fonte
Qt fornece a API mais simples
Se você quiser um ponteiro de dados não constante, use
fonte