【问题标题】:How do i convert a QString to a char*如何将 QString 转换为 char*
【发布时间】:2012-11-04 14:53:16
【问题描述】:

我有一个 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*。我该如何解决这个问题?

【问题讨论】:

  • 不要。您将获得一个指向您可能无法修改的数据的指针,因此不要将其分配给char*。将其分配给char const*。为什么要长期存储指针?
  • @billz:不完全是一个骗局。似乎 Amre 想要一个指向可变字符的指针,而不是 const char*
  • 复制是什么?意思是。我不能使用 const char* 因为我有一个看起来像这样的类客户端:class Client { public: Client(); void init(QString name); void sendMessage(QString mess); private: char *myMailboxName, buf[MSG_SIZE]; struct mq_attr attr; mqd_t mq_ownBox, mq_centralBox; }; 在程序启动之前我不知道 myMailboxName 的值,如果我刚刚创建了一个 const char* 它会在之后超出范围我从两端调用它的函数。
  • @Amre dup = 重复,或相同的问题

标签: c++ qt char qstring


【解决方案1】:

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

使用 memcpy 函数

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您确实可以按照 Mike 的建议使用 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() );
      

      到达:stackoverflow similar question

      【讨论】:

        【解决方案4】:

        试试这个代码sn-p

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

        【讨论】:

        • 欢迎获得您的前 10 个代表点数。请查看如何使用 Markdown 格式 - 这将允许您的答案中的代码突出显示语法并以等宽字体显示。答案/问题文本字段旁边是“?”提供基本信息的图标。
        • 注意:这可能会导致程序崩溃,因为 toLatin1() 返回的 QByteArray 在行尾消失。 data() 返回的指针不指向任何东西。
        【解决方案5】:

        我使用类似这样的包装器:

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

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

        【讨论】:

          【解决方案6】:

          考虑以下示例
          QString str = "BlahBlah;"

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

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

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

          每种语法都适合我;)

          【讨论】:

            猜你喜欢
            • 2020-04-20
            • 1970-01-01
            • 2014-08-17
            • 2020-11-13
            • 2014-01-16
            • 2011-07-27
            • 1970-01-01
            • 2015-01-03
            • 2015-05-08
            相关资源
            最近更新 更多