C++ 如何将QString转换为char*
我有一个QString,我想将它转换成char*而不是QChar*,因为我将把它传递到一个接受char*的方法中,但是如果它没有得到const 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 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在行尾消失。数据返回的指针不指向任何内容。