110

次の方法で 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());

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

4

10 に答える 10

128

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

だから、おそらくあなたは他の問題を抱えています。これはどのように正確に機能しませんか?

于 2010-03-26T14:02:21.277 に答える
64

多分

my_qstring.toStdString().c_str();

Federicoが指摘するように、またはより安全です:

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

最適とはほど遠いですが、うまくいきます。

于 2010-06-01T23:56:31.257 に答える
61

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

于 2016-05-10T08:51:59.597 に答える
7

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);
于 2010-08-04T17:56:57.593 に答える
3

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

于 2010-03-26T14:37:24.297 に答える
2

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

   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<<"<---";
于 2016-05-29T08:22:48.590 に答える
0

std::vector を中間コンテナーとして使用するのは実行可能な方法です。

QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();
于 2020-07-01T13:17:30.740 に答える