কিউ স্ট্রিং থেকে চর * রূপান্তর


99

আমি নিম্নলিখিত পদ্ধতিগুলি দ্বারা একটি কিউস্ট্রিংকে চর * টাইপে রূপান্তর করার চেষ্টা করছিলাম, তবে তারা কাজ করছে বলে মনে হয় না।

//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
আমার ইংরাজির জন্য দুঃখিত তবে কেন এই জাতীয় পদ্ধতির ব্যবহার করা ঠিক নয়? QString s("some"); printf(reinterpret_cast<char *>(s.data()));
বার্টোলো-ওট্রিট

উত্তর:


118

ওয়েল, 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();
}

সুতরাং সম্ভবত আপনি অন্যান্য সমস্যা হচ্ছে। ঠিক কীভাবে এই কাজ করে না?


11
const char*এবং char*একই ধরণের নয়।
হালকা রেস রেস

4
@ লাইটনেসেসেসিন অরবিত: কিউ স্ট্রিংয়ের বিষয়বস্তু না জেনে এটি লেখার বিষয়টি একটি ভয়াবহ ধারণা, সুতরাং যা const char*সত্য তা পাওয়া যায়। ব্যবহারকারী লিখিত বাফারে ডেটা অনুলিপি করতে বিনামূল্যে।
এলি বেন্ডারস্কি

4
আমি পুরোপুরি একমত. তবে যে প্রশ্নটি সম্পর্কে জিজ্ঞাসা করা হয়েছিল char*, তা নয় char const*এবং আপনার উত্তর কেবল উল্লেখ ব্যতিরেকে সেই সত্যটিকে উপেক্ষা করে।
অরবিট

4
@ লাইটনেসেসেসিনআরবিট: কখনও কখনও সর্বোত্তম উত্তরটি প্রশ্নটি ছড়িয়ে দেওয়া। অন্য কথায়, এটি উল্লেখ করতে যে এটি সঠিক জিনিসটি জিজ্ঞাসা করছে না। এই উত্তরটি প্রশ্ন পোস্টারের মাধ্যমে গৃহীত হয়েছিল, সুতরাং আমি মনে করি এটির লক্ষ্য
এলি বেন্ডারস্কি hit

4
এফএকিউ ব্যবহার করার মতো আপডেট হয়েছে বলে মনে হচ্ছে toLocal8Bit()?
ল্যারি

53

হতে পারে

my_qstring.toStdString().c_str();

বা নিরাপদ, যেমন ফেডেরিকো উল্লেখ করেছেন:

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

এটি অনুকূল থেকে অনেক দূরে, তবে কাজটি করবে।


4
এটি ইউনিকোড চরিত্রগুলিকে বিশৃঙ্খলা করবে। একটি ইউনিকোড বান্ধব সমাধান: stackoverflow.com/a/4644922/238387
jlstrecker

21
এই পদ্ধতিটি অত্যন্ত বিপজ্জনক এবং ব্যবহার করা উচিত নয়: toStdString()একটি নতুন std::stringঅবজেক্ট ফিরিয়ে দিন এবং তারপরে অভ্যন্তরীণ ডেটারে পয়েন্টার const char *পাওয়া যাবে। তবে স্ট্রিং অবজেক্টটি এই বিবৃতি দেওয়ার পরে অবিলম্বে ধ্বংস হয়ে যায়, সুতরাং ফলস পয়েন্টারের সম্ভবত কোনও বৈধ ঠিকানা নেই যদি আপনি এটি পরবর্তী বিবৃতিতে ব্যবহার করেন।
রিকোরিকো

@ রিকোরিকো এটি পদ্ধতি নয় toStdString() বিপজ্জনক ; এটি কাঁচা পয়েন্টার ব্যবহার। বা আরও সুনির্দিষ্টভাবে বলা যেতে পারে, এমন বস্তুগুলির কাঁচা পয়েন্টারগুলির ব্যবহার যার স্কোপগুলি ভালভাবে বোঝা যায় না।
notlesh

বিশেষত সি ++ টেম্পোরারিগুলি এগুলি তৈরি করে এমন বিবৃতি শেষ না হওয়া পর্যন্ত সাধারণত বেঁচে থাকে। সুতরাং উত্তরের প্রথম ফর্মটি ঠিক আছে যদি এটি কোনও ফাংশন কলে ইন-লাইন ব্যবহার করে (ধরে নেওয়া যায় যে ফাংশনটি ভবিষ্যতের ব্যবহারের জন্য পয়েন্টারটি সংরক্ষণ করে না) তবে এটি যদি ভেরিয়েবলের জন্য নির্ধারিত হয় তবে তা ঠিক নয়।
প্লাগওয়াশ

46

রূপান্তর করার সবচেয়ে সহজ উপায় QString করতে গৃহস্থালি * হয় qPrintable (QString & Str const) , যা একটি ম্যাক্রো বিস্তৃত হয় str.toLocal8Bit().constData()


কেন এটি আরও জনপ্রিয় উত্তর নয়? আমি কিউটি উত্সটির আশেপাশে পোকার সময় দুর্ঘটনাক্রমে এই সম্পর্কে শিখেছি এবং তারা ঠিক সেটাই করে।
ফালুসিয়াস

6
@ ফিউলুসিয়াস, কারণ: ১) qPrintableফেরত দেয় const char*না char*, str.toLocal8Bit().data()ফিরে আসে char*। 2) নির্দেশকটি const char*অবৈধ হয়ে যায় আপনি যে বিবৃতিতে একটি সেমিকোলন qPrintableব্যবহার করেছিলেন তা ব্যবহার করা হয়েছিল। সুতরাং const char* c_ptr = s.toLocal8Bit().constData();কোন মানে হয় না।
উইন্ডিফিল্ডস

4
@ ফিউলুসিয়াস ধন্যবাদ আপনি জীবন রক্ষাকারী :) এই সমস্ত শীর্ষে ভোট দেওয়া উত্তরগুলি ভুল, প্রশ্ন চর সম্পর্কে এবং তারা
কনস্টের চরটি

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

সি স্টাইলের ingালাই ব্যবহার করতে ভুলবেন না।
kyb


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)
const char *qUtf8Printable(const QString &str)

আপনি যদি নন-কনস্টেন্ট ডেটা পয়েন্টার ব্যবহার করতে চান

str.toLocal8Bit().data()
str.toUtf8().data()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.