C++ QString到char*的转换

C++ QString到char*的转换,c++,qt,qstring,qtcore,C++,Qt,Qstring,Qtcore,我试图通过以下方法将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()); 你能用这种方法详细说明可能存在的缺陷吗,或者给出一

我试图通过以下方法将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());
你能用这种方法详细说明可能存在的缺陷吗,或者给出一种替代方法吗?

嗯,专家说:


也许你还有其他问题。这到底是怎么回事?

您的字符串可能包含非拉丁字符,这会导致未定义的数据。这取决于你所说的“它似乎不起作用”是什么意思。

也许吧

my_qstring.tostString().c_str()

或者更安全,正如费德里科指出的:

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

它远不是最佳的,但可以完成这项工作。

如果您仅将其用于输出到文件或在屏幕上显示,则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);

将字符转换为字符*的最简单方法是,
这是一个宏,扩展到
str.toLocal8Bit().constData()

正确的解决方案如下

   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<<"<---";
QString k;
k=“Crazyyyyqt”;
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()已编辑

这种方法也有效

QString str ("Something");

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

如果字符串包含非ASCII字符-最好这样做:
s.toUtf8().data()
(或
s->toUtf8().data()

使用std::vector作为中间容器是一种可行的方法:

QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();
qstringdatasrc(“FooBar”);
QString-databa=dataSrc.toUtf8();
向量数据(databa.begin(),databa.end());
char*pDataChar=data.data();

Qt提供了最简单的API

const char *qPrintable(const QString &str)
const char *qUtf8Printable(const QString &str)
如果需要非常量数据指针,请使用

str.toLocal8Bit().data()
str.toUtf8().data()


你的例子对我来说很好,问题在哪里?对不起,我的英语不好,但为什么使用这种方法是不对的<代码>QString s(“部分”);printf(重新解释(s.data())这会弄乱Unicode字符。Unicode友好的解决方案:此方法非常危险,不应使用:
toStdString()
返回一个新的
std::string
对象,然后获得指向内部数据
const char*
的指针。但是,字符串对象在该语句之后立即被销毁,因此如果在后续语句中使用结果指针,结果指针可能没有有效地址。@RicoRico危险的不是方法
toStdString()
;这是对原始指针的使用。或者更具体地说,使用来自范围不太清楚的对象的原始指针。具体来说,C++临时性通常存在于创建它们的语句的末尾。因此,如果答案中的第一个表单在函数调用中联机使用(假设函数不存储指针以备将来使用),则答案中的第一个表单是可以的但是如果它被分配给一个变量就不好了。
const char*
char*
不是同一个类型。@LightnessRacesinOrbit:在它不知道的情况下写入QString的内容是一个可怕的想法,因此当然
const char*
才是真正可以获得的。用户可以自由地将数据复制到可写缓冲区。我完全同意。但是,所问的问题是关于
char*
,而不是
char const*
,而您的回答只是忽略了这一事实而没有提及。@lightness racesinorbit:有时最好的答案是取消对该问题的回答。换句话说,要指出它问的不是正确的事情。这个答案被问题海报接受了,所以我想它达到了目的。似乎FAQ已经更新为使用
toLocal8Bit()
?为什么这不是一个更流行的答案?我只是在拨弄Qt源代码时偶然了解到这一点,这正是他们所做的。@Phlucious,因为:1)
qPrintable
returns
const char*
not
char*
str.toLocal8Bit().data()
returns
char*
。2) 只要在使用了
qPrintable
的语句中键入分号,指向
const char*
的指针就会失效。所以
const char*c_ptr=s.toLocal8Bit().constData()没有任何意义。@p谢谢你是救命恩人:)这些最热门的答案都是错误的,问题是关于char的,他们返回const char*is
qPrintable
输出保证以零结尾?@WindyFields-如
qPrintable()
说明中所警告的:“在使用qPrintable()的语句之后,字符指针将无效。”忘记使用C样式转换。这看起来像是不同的转换(
std::string
QString
),而不是所要求的。ch是一个悬空指针。
str.toLocal8Bit().data()
str.toUtf8().data()