gpt4 book ai didi

c++ - 从 QString 的 QMap 创建 char 数组时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:09 25 4
gpt4 key购买 nike

我正在使用 libxslt C 库,需要传入参数 const char * .我将库包装在 Qt C++ 类中,因此存储在 C++ 类中的参数存储为 QMap<QString, QString> .

我的第一次尝试很简单:

const char *params[32];
int index = 0;
if (m_params.size() > 0) {
QMapIterator<QString, QString> it(m_params);
while (it.hasNext()) {
it.next();

params[index++] = it.key().toLocal8Bit().data();

params[index++] = it.value().toLocal8Bit().data();
}
}

params[index++] = nullptr;

qDebug() << params[0] << params[1]; // 0 0

但我意识到这是行不通的,因为 QByteArray来自 toLocal8bit几乎在我使用它后就超出了范围。

我试过使用 strcpy - 但有相同的范围问题:

m_params.insert("some-key", "some-value", "another-key", "another-value");

if (m_params.size() > 0) {
QMapIterator<QString, QString> it(m_params);
while (it.hasNext()) {
it.next();

char buffer[32];

strcpy(buffer, it.key().toLocal8Bit().data());
params[index++] = buffer;

strcpy(buffer, it.value().toLocal8Bit().data());
params[index++] = buffer;
}
}

params[index++] = nullptr;

qDebug() << params[0] << params[1]; // another-value another-value

所以现在我有一个参数列表,所有参数都具有相同的值。

当我手动设置所有值时,我得到了预期的结果:

const char *params[32];
int index = 0;

params[index++] = "something";
params[index++] = "something-else";

params[index++] = nullptr;

qDebug() << params[0] << params[1]; // something something-else

最佳答案

这很简单 - 您需要确保参数缓冲区持续足够长的时间。不要使用固定大小的数组 - 您正在为缓冲区溢出做好准备。

class Params {
QByteArray buf;
QVector<const char *> params;
public:
Params() = default;
template <class T> explicit Params(const T& map) {
QVector<int> indices;
indices.reserve(map.size());
params.reserve(map.size()+1);
for (auto it = map.begin(); it != map.end(); ++it) {
indices.push_back(buf.size());
buf.append(it.key().toLocal8Bit());
buf.append('\0');
indices.push_back(buf.size());
buf.append(it.value().toLocal8Bit());
buf.append('\0');
}
for (int index : qAsConst(indices))
params.push_back(buf.constData() + index);
params.push_back(nullptr);
}
operator const char **() const { return const_cast<const char**>(params.data()); }
operator const char *const*() const { return params.data(); }
operator QVector<const char*>() const { return params; }
};

void MyClass::method() const {
Params params{m_params};
...
res = xsltApplyStylesheet(cur, doc, params);
...
}

关于c++ - 从 QString 的 QMap 创建 char 数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50322203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com