14

QString::arg()文字列にプレース マーカーの直後に数字が含まれている場合に問題が発生します。QString::arg()このような置換の場合に何が起こるかは、関数の説明からは明らかではありません。

QString("String for replacement %1234").arg("blah");

これはまたはになり"String for replacement blah234"ます"String for replacement blah34"か?

この質問に答えるために、QT のソース コードを調べました。場所のマーカーを探すアルゴリズムは「貪欲」で、上記の例では両方の数字を使用しているようです。

QString::arg()(QT 4.8.4)内で使用されるQTの関数のソースは次のとおりです。

static ArgEscapeData findArgEscapes(const QString &s)
{
const QChar *uc_begin = s.unicode();
const QChar *uc_end = uc_begin + s.length();

ArgEscapeData d;

d.min_escape = INT_MAX;
d.occurrences = 0;
d.escape_len = 0;
d.locale_occurrences = 0;

const QChar *c = uc_begin;
while (c != uc_end) {
    while (c != uc_end && c->unicode() != '%')
        ++c;

    if (c == uc_end)
        break;
    const QChar *escape_start = c;
    if (++c == uc_end)
        break;

    bool locale_arg = false;
    if (c->unicode() == 'L') {
        locale_arg = true;
        if (++c == uc_end)
            break;
    }

    if (c->digitValue() == -1)
        continue;

    int escape = c->digitValue();
    ++c;

    if (c != uc_end && c->digitValue() != -1) {
        escape = (10 * escape) + c->digitValue();
        ++c;
    }

    if (escape > d.min_escape)
        continue;

    if (escape < d.min_escape) {
        d.min_escape = escape;
        d.occurrences = 0;
        d.escape_len = 0;
        d.locale_occurrences = 0;
    }

    ++d.occurrences;
    if (locale_arg)
        ++d.locale_occurrences;
    d.escape_len += c - escape_start;
}
return d;
}

常に 2 桁の場所マーカーを使用するよりも、このようなあいまいさを解決するためのより良い方法はありますか?

4

3 に答える 3

4

arg(const QString & a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ' ' )) の Qt ヘルプ状態

この文字列のコピーを、最も小さい番号の場所マーカーを文字列 a に置き換えたもの、つまり %1、%2、...、%99 で返します。

...

場所のマーカー番号は 1 ~ 99 の範囲である必要があります。

したがって、表示されているものは、定義上、正しいものです。最初の 2 つの数字が置き換えられます。「blah234 の置換用の文字列」が必要な場合は、文字列を次のように定義できます。

QString("String for replacement %1%2").arg("blah").arg(234);
于 2013-05-24T15:57:16.863 に答える
1

私は同じ問題を抱えていますが、順番の回答は私にとって良い方法のようには見えません。

このように曖昧さを解消しました。

QString myString= QString("ConcatenatedNumbers%0123").arg(66,3,10, QChar('0'));

文字列は次のようになります。

ConcatenatedNumbers06623
于 2016-09-10T10:19:13.297 に答える