我有一个QString,我想将其转换为char *而不是QChar *,因为我将它传递给一个带有char *的方法,但是如果没有它获取const char我就无法转换它*。例如,我尝试过:
QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.constData();
和
QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.data();
其中myMailboxName是我班级中的私人字符*。但是我得到一个错误,因为它返回一个const char *并且不能将它分配给char *。我该如何解决这个问题?
答案 0 :(得分:3)
这是因为data()返回bytearray中缓冲区的地址,你可以读取它,但显然你不应该写它。 你在bytearray之外有自己的缓冲区。如果需要数据,则应将bytearray的缓冲区复制到myMailBoName。
使用memcpy函数
答案 1 :(得分:2)
试试此代码段
const char *myMailboxName = name.toLatin1().data();
答案 2 :(得分:1)
使用strdup。它同时进行分配和复制。只要记得在完成后立即释放它。
答案 3 :(得分:1)
你可以真正使用strdup
(stackoverflow question about it),正如迈克建议的那样,但你也可以这样做:
// 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() );
答案 4 :(得分:0)
我使用类似这个包装器的东西:
template<typename T, typename Y>
void CharPasser(std::function<T(char *)> funcToExecute, const Y& str)
{
char* c = 0;
c = qstrdup(c, str.c_str());
funcToExecute(c);
delete[] c;
}
int SomeFunc(char* ){}
然后使用它:
CharPasser<int, std::string>(SomeFunc, QString("test").tostdString())
至少可以节省一些打字......:)
答案 5 :(得分:0)
请考虑以下示例
QString str = "BlahBlah;"
试试这个char* mychar = strdup(qPrintable(str));
或者这个{{{ 1}}
或者这个char* mychr = str.toStdString().c_str();
每种语法都适用于我;)