سؤال

كنت أحاول تحويل 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());

هل يمكنك توضيح الخلل المحتمل مع هذه الطريقة ، أو إعطاء طريقة بديلة؟

هل كانت مفيدة؟

المحلول

حسنا ، و QT الأسئلة الشائعة يقول:

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

لذلك ربما تواجه مشاكل أخرى. كيف بالضبط لا يعمل هذا؟

نصائح أخرى

يمكن

my_qstring.toStdString().c_str();

أو أكثر أمانًا ، كما يشير فيديريكو:

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

إنه أبعد ما يكون عن الأمثل ، لكنه سيقوم بالعمل.

أسهل طريقة لتحويل أ Qstring ل شار* هو Qprintable (const qstring & str)، وهو ماكرو يتوسع إلى str.toLocal8Bit().constData().

تعمل إجابة 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);

تحرير

بهذه الطريقة تعمل أيضًا

QString str ("Something");

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

قد تحتوي السلسلة الخاصة بك على أحرف غير Latin1 ، مما يؤدي إلى بيانات غير محددة. يعتمد ذلك على ما تعنيه بـ "لا يبدو أنه يعمل".

الحل الصحيح سيكون هكذا

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

إذا كانت سلسلةك تحتوي على أحرف غير ASCII - فمن الأفضل أن تفعل ذلك بهذه الطريقة:s.toUtf8().data() (أو s->toUtf8().data())

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top