[英]Problems creating a char array from a QMap of QString
我正在使用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
但是我意识到这是行不通的,因为toLocal8bit
的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);
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.