web-dev-qa-db-ja.com

QStringからchar *への変換

次の方法でQStringをchar *型に変換しようとしましたが、機能していないようです。

//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());

この方法で考えられる欠陥を詳しく説明できますか、または別の方法を教えてください。

81
mawia

さて、 Qt FAQ のコメント:

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();
}

したがって、おそらく他の問題が発生しています。これはどのくらい正確に機能しませんか?

107
Eli Bendersky

多分

my_qstring.toStdString().c_str();

フェデリコが指摘するように、より安全です:

std::string str = my_qstring.toStdString();
const char* p = str.c_str();

それは最適とはほど遠いですが、仕事をします。

43
davidnr

QStringchar *に変換する最も簡単な方法は qPrintable(const QString&str) 、これはstr.toLocal8Bit().constData()に展開されるマクロです。

36
Robert

Davidの答えは、ファイルへの出力または画面表示にのみ使用している場合は問題なく機能しますが、関数またはライブラリが解析にchar *を必要とする場合、この方法が最適です。

// 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);
6
Alex

編集

この方法も機能します

QString str ("Something");

char* ch = str.toStdString().C_str();
3
Shanks

文字列にLatin1以外の文字が含まれている可能性があり、未定義のデータになります。 「機能しないようだ」という意味によって異なります。

2
gregseth

正しい解決策は次のようになります

   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<<"<---";
2
sam

文字列に非ASCII文字が含まれている場合-s.toUtf8().data()(またはs->toUtf8().data())のようにすることをお勧めします

0
AlexDarkVoid