Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将QString转换为char*_C++_Qt_Char_Qstring - Fatal编程技术网

C++ 如何将QString转换为char*

C++ 如何将QString转换为char*,c++,qt,char,qstring,C++,Qt,Char,Qstring,我有一个QString,我想将它转换成char*而不是QChar*,因为我将把它传递到一个接受char*的方法中,但是如果它没有得到const char*,我就无法转换它。例如,我尝试过: QString name = "name"; QByteArray byteArray = name.toUtf8(); myMailboxName = byteArray.constData(); 及 其中myMailboxName是类中的私有字符*。但是,我得到一个错误,因为它返回一个常量char*,并

我有一个QString,我想将它转换成char*而不是QChar*,因为我将把它传递到一个接受char*的方法中,但是如果它没有得到const char*,我就无法转换它。例如,我尝试过:

QString name = "name";
QByteArray byteArray = name.toUtf8();
myMailboxName = byteArray.constData();


其中myMailboxName是类中的私有字符*。但是,我得到一个错误,因为它返回一个常量char*,并且无法将其分配给char*。如何修复此问题?

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


使用memcpy函数这是因为数据返回字节数组中缓冲区的地址,您可以读取它,但显然不应该写入它。 您在bytearray之外有自己的缓冲区。如果需要数据,应该将bytearray的缓冲区复制到myMailBoName中


使用memcpy函数

使用strdup。它同时进行分配和复制。只要记住一旦完成就释放它。

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

正如Mike所建议的那样,你可以真正使用strdup,但你也可以这样做:

// 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() );
达到目的:。

正如Mike建议的那样,您确实可以使用strdup,但您也可以这样做:

// 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() );
到了:。

试试这个代码片段

const char *myMailboxName = name.toLatin1().data();
请尝试此代码段

const char *myMailboxName = name.toLatin1().data();

我使用类似于此包装的东西:

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

至少这样可以节省一点打字时间…:

我使用类似于此包装的东西:

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

至少这样可以节省一点打字时间…:

考虑以下示例:字符串str=BlahBlah;试试thischar*mychar=strdupqPrintablestr;或者thischar*mychr=str.toStdString.c_str;或者thischar*mychar=strdupstr.ascii;每一种语法都适合我

考虑以下示例:字符串str=BlahBlah;试试thischar*mychar=strdupqPrintablestr;或者thischar*mychr=str.toStdString.c_str;或者thischar*mychar=strdupstr.ascii;每一种语法都适合我

杜普?不要。您将获得一个指向您可能无法修改的数据的指针,因此不要将其分配给char*。将其分配给char const*。你为什么长期存储指针?@billz:不完全是dup。似乎Amre想要一个指向可变字符的指针,而不是常量字符*dup是什么?意思是我不能使用常量字符*,因为我有一个类客户端,它看起来是这样的:类客户端{public:client;void initQString name;void sendMessageQString mess;private:char*myMailboxName,buf[MSG_SIZE];struct mq_attr attr;mqd_t mq_ownBox,mq_centralBox;我不知道程序启动时myMailboxName的值,如果我刚刚创建了一个const char*,它将在我从末尾调用函数后超出范围。@Amre dup=replication,还是同一个questiondup?不要。您将获得一个指向您可能无法修改的数据的指针,因此不要将其分配给char*。将其分配给char const*。你为什么长期存储指针?@billz:不完全是dup。似乎Amre想要一个指向可变字符的指针,而不是常量字符*dup是什么?意思是我不能使用常量字符*,因为我有一个类客户端,它看起来是这样的:类客户端{public:client;void initQString name;void sendMessageQString mess;private:char*myMailboxName,buf[MSG_SIZE];struct mq_attr attr;mqd_t mq_ownBox,mq_centralBox;我不知道程序启动时myMailboxName的值,如果我只是创建了一个const char*,它将在我从末尾调用函数后超出范围。@Amre dup=replication,或者同样的问题欢迎获得前10个代表分数。请查看如何使用标记格式-这将允许您的答案中的代码语法突出显示并以单空格字体显示。答案/问题文本字段旁边是一个“?”图标,提供基本信息。注意:这可能会导致程序崩溃,因为toLatin1返回的QByteArray在行尾消失。数据返回的指针指向零。欢迎获取前10个代表点。请查看如何使用标记格式-这将允许您的答案中的代码语法突出显示并以单空格字体显示。答案/问题文本字段旁边是一个“?”图标,提供基本信息。注意:这可能会导致程序崩溃,因为toLatin1返回的QByteArray在行尾消失。数据返回的指针不指向任何内容。