Q * स्ट्रिंग के लिए चार रूपांतरण


93

मैं निम्नलिखित विधियों द्वारा एक 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());

क्या आप इस विधि के साथ संभावित दोष को विस्तृत कर सकते हैं, या कोई वैकल्पिक विधि दे सकते हैं?


आपका उदाहरण मेरे लिए ठीक काम करता है, समस्या कहां है?
विएस्टर

3
मेरी अंग्रेजी के लिए क्षमा करें, लेकिन इस तरह के दृष्टिकोण का उपयोग करना सही क्यों नहीं है? QString s("some"); printf(reinterpret_cast<char *>(s.data()));
बार्टोलो-ओट्री

जवाबों:


114

खैर, क्यूटी पूछे जाने वाले प्रश्न कहते हैं:

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

तो शायद आपको अन्य समस्याएं हो रही हैं। यह वास्तव में कैसे काम नहीं करता है?


11
const char*और char*एक ही प्रकार के नहीं हैं।
कक्षा

3
@LightnessRacesinOrbit: QString की सामग्री को लिखे बिना इसे जानना एक भयानक विचार है, इसलिए निश्चित रूप const char*से वास्तव में प्राप्त किया जा सकता है। उपयोगकर्ता डेटा को एक लिखने योग्य बफर में कॉपी करने के लिए स्वतंत्र है।
एली बेंडरस्की

1
मैं पूरी तरह से सहमत। हालाँकि, इस बारे में पूछे गए सवाल char*, नहीं char const*, और आपका जवाब बिना उल्लेख किए उस तथ्य को अनदेखा कर देता है।
in पर कक्षा

4
@LightnessRacesinOrbit: कभी-कभी सबसे अच्छा जवाब सवाल का अनावरण करना है। दूसरे शब्दों में, यह इंगित करने के लिए कि यह सही बात नहीं पूछ रहा है। यह उत्तर प्रश्न पोस्टर द्वारा स्वीकार किया गया था, इसलिए मुझे लगता है कि यह अपने लक्ष्य को हिट कर रहा है
एली बेंडरस्की

2
ऐसा लगता है कि सामान्य प्रश्न का उपयोग करने के लिए अद्यतन किया गया है toLocal8Bit()?
लैरी

50

शायद

my_qstring.toStdString().c_str();

या सुरक्षित है, जैसा कि फेडरिको बताता है:

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

यह इष्टतम से बहुत दूर है, लेकिन काम करेगा।


3
यह यूनिकोड वर्णों को गड़बड़ कर देगा। एक यूनिकोड के अनुकूल समाधान: stackoverflow.com/a/4644922/238387
jlstrecker

21
यह विधि बहुत खतरनाक है और इसका उपयोग नहीं किया जाना चाहिए: toStdString()एक नई std::stringवस्तु लौटाएं और फिर आंतरिक डेटा को सूचक const char *प्राप्त किया जाता है। हालांकि, इस कथन के बाद स्ट्रिंग ऑब्जेक्ट को तुरंत नष्ट कर दिया जाता है, इसलिए परिणाम सूचक का संभवतः एक वैध पता नहीं है यदि आप इसे बाद के बयान में उपयोग करते हैं।
रिको रिको

@RicoRico यह वह विधि नहीं है जो toStdString()खतरनाक है; यह कच्चे संकेत का उपयोग है। या, अधिक विशेष रूप से, उन ऑब्जेक्ट्स से कच्चे पॉइंटर्स का उपयोग जिनके स्कोप अच्छी तरह से समझ में नहीं आते हैं।
मांस नहीं

विशेष रूप से C ++ अस्थायी आमतौर पर बयान के अंत तक रहते हैं जो उन्हें बनाता है। तो जवाब में पहला रूप ठीक है अगर यह एक फ़ंक्शन कॉल में लाइन का उपयोग किया जाता है (यह मानते हुए कि फ़ंक्शन भविष्य के उपयोग के लिए पॉइंटर को संग्रहीत नहीं करता है), लेकिन यह ठीक नहीं है अगर यह एक चर को सौंपा गया है।
प्लग

46

सबसे आसान तरीका है एक कन्वर्ट करने के लिए QString को चार * है qPrintable (QString और str स्थिरांक) है, जो एक मैक्रो के विस्तार है str.toLocal8Bit().constData()


यह एक अधिक लोकप्रिय उत्तर क्यों नहीं है? मैंने बस Qt स्रोत के आसपास प्रहार करते हुए दुर्घटना के बारे में सीखा है, और ठीक यही वे करते हैं।
15

6
@ खुश, क्योंकि: 1) qPrintableरिटर्न const char*नहीं char*, str.toLocal8Bit().data()रिटर्न char*। 2) const char*जैसे ही आप qPrintableइस्तेमाल किए गए स्टेटमेंट में एक अर्धविराम को हिट करते हैं , सूचक अवैध हो जाता है। तो const char* c_ptr = s.toLocal8Bit().constData();कोई मतलब नहीं है।
विंडीफील्ड ने

1
@ शानदार धन्यवाद, आप जीवन रक्षक हैं :) ये सभी शीर्ष मतदान के उत्तर गलत हैं, प्रश्न चार के बारे में है और वे
कांस्टेबल

क्या qPrintableउत्पादन शून्य होने की गारंटी है?
गियोवन्नी सेरेटानी

@IndyFields - जैसा कि qPrintable()विवरण में चेतावनी दी गई है : "वर्ण सूचक उस कथन के बाद अमान्य होगा जिसमें qPrintable () का उपयोग किया गया है।"
जेरेमी

6

डेविड का जवाब ठीक काम करता है यदि आप इसे केवल फ़ाइल में आउटपुट के लिए या स्क्रीन पर प्रदर्शित करने के लिए उपयोग कर रहे हैं, लेकिन यदि किसी फ़ंक्शन या लाइब्रेरी को पार्सिंग के लिए चार * की आवश्यकता होती है, तो यह विधि सबसे अच्छा काम करती है:

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

4

संपादित

इस तरह से भी काम करता है

QString str ("Something");

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

यह एक अलग रूपांतरण ( std::stringQString) की तरह दिखता है , न कि क्या मांगा जाता है।
टोबी स्पाइट

3

आपके स्ट्रिंग में गैर लैटिन 1 वर्ण हो सकते हैं, जो अपरिभाषित डेटा की ओर जाता है। यह इस बात पर निर्भर करता है कि आपके द्वारा "यह काम नहीं करता है" से क्या मतलब है।


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

सी-स्टाइल कास्टिंग का उपयोग करना भूल जाते हैं।
kyb

2

यदि आपके स्ट्रिंग में गैर- ASCII वर्ण हैं - तो इसे इस तरह करना बेहतर है: s.toUtf8().data()(या s->toUtf8().data())


0

यह std का उपयोग करने के लिए एक व्यवहार्य तरीका है :: वेक्टर एक मध्यवर्ती कंटेनर के रूप में:

QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();

0

Qt सबसे सरल एपीआई प्रदान करता है

const char *qPrintable(const QString &str) and const char *qUtf8Printable(const QString &str)

यदि आप नॉन-कास्ट डेटा पॉइंटर का उपयोग करना चाहते हैं

str.toLocal8Bit().data() or str.toUtf8().data()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.