Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kambala от Август 16, 2011, 16:13



Название: преобразовать printf-like формат в QString-like
Отправлено: kambala от Август 16, 2011, 16:13
Здравствуйте. Есть объект типа QString, в котором записана utf-8 строка с форматом, который используется в функции (s)printf (скажем, есть %d и %s, без всяких спецификаторов). Как правильно подставить в такую строку аргументы?

Пробовал варианты через sprintf() с последующим преобразованием в QString, но это крашит программу в момент вызова sprintf() (как и использование QString::sprintf(), но там еще и нельзя формат подавать в utf-8):
Код
C++ (Qt)
QString formatString;
const char *format = formatString.toUtf8().constData();
char *buf = new char[qstrlen(format)];
sprintf(buf, format, ...);
formatString = QString::fromUtf8(buf);
delete [] buf;
Код
C++ (Qt)
QString formatString;
QByteArray ba = formatString.toUtf8();
sprintf(formatString.toUtf8().data(), ba.constData(), ...);

Еще приходил в голову костыль с использованием QRegExp("%\\w"), но пока что остановился на таком:
Код
C++ (Qt)
QString formatString;
// не учитываем возможность '%' быть последним символом и того, что аргументов может быть более 9
for (int i = 0, k = 1; i < prop.descPositive.length(); ++i)
   if (formatString.at(i) == '%' && formatString.at(i + 1).isLetter())
       formatString[++i] = QString::number(k++).at(0);
formatString = formatString.replace("%%", "%").arg(...);


Название: Re: преобразовать printf-like формат в QString-like
Отправлено: alex312 от Август 16, 2011, 18:18
QString & QString::sprintf ( const char * cformat, ... ) (http://doc.qt.nokia.com/4.7/qstring.html#sprintf) ?


Название: Re: преобразовать printf-like формат в QString-like
Отправлено: kambala от Август 16, 2011, 18:28
но это крашит программу в момент вызова sprintf() (как и использование QString::sprintf(), но там еще и нельзя формат подавать в utf-8)


Название: Re: преобразовать printf-like формат в QString-like
Отправлено: brankovic от Август 16, 2011, 20:16
const char *format = formatString.toUtf8().constData();

так нельзя делать