1

我有一个 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 是我班级中的私人 char* 。但是我收到一个错误,因为它返回一个 const char* 并且无法将其分配给 char*。我怎样才能解决这个问题?

4

6 回答 6

3

这是因为data()返回的是字节数组中缓冲区的地址,可以读,但显然不应该写。您在字节数组之外有自己的缓冲区。如果你想要数据,你应该将 bytearray 的缓冲区复制到 myMailBoName 中。

使用 memcpy 函数

于 2012-11-15T22:13:52.897 回答
2

试试这个代码片段

const char *myMailboxName = name.toLatin1().data();
于 2012-11-28T13:12:52.350 回答
1

使用 strdup。它同时进行分配和复制。完成后请记住释放它。

于 2012-11-16T04:16:56.313 回答
1

正如 Mike 建议的那样,你真的可以使用strdup关于它的 stackoverflow 问题),但你也可以这样做:

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

到了那里:stackoverflow 类似的问题

于 2012-11-16T14:31:45.053 回答
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())

至少这可以节省一些打字... :)

于 2012-12-14T12:23:29.153 回答
0

考虑下面的例子
QString str = "BlahBlah;"

试试这个
char* mychar = strdup(qPrintable(str));

或这个
char* mychr = str.toStdString().c_str();

或这个
char* mychar = strdup(str.ascii());

每个语法都对我有用;)

于 2016-04-18T19:15:14.603 回答