LINUX.ORG.RU

Новомодные способы форматирования текста

 


0

1

Я понимаю, что sprintf() не безопасно и не портируемо, но почему альтернативы такое го..но?

QString result;
QTextStream(&result) << "pi = " << 3.14;
// result == "pi = 3.14"

А что если мне нужно «03.14000» ?

QString status = QString("Processing file %1 of %2: %3").arg(i).arg(total).arg(fileName);

А что если мне нужно «0x00012345»?

Все новые языки и библиотеки предлагают использовать эти обрубки, которые только пригодны для отладочной информации, да и то не всегда.

★★★★

Ну и в стандартных плюсах есть модификаторы вывода

std::ostream os;
std::ios_base::fmtflags ff;
ff = os.flags();
setf(std::ios_base::scientific);
os << std::right << "whatever = " << std::setw(13) << whatever;
os.flags(ff);
Stil ★★★★★
()

Как sprintf(), часть стандартной библиотеки, стала непортируемой? И в чём её небезопасность?

pavlick ★★
()
Ответ на: комментарий от pavlick

Переполнения буфферов и разная интерпретация %lld разными компиляторами. Есть конечно всякие PRId64, но это полный изврат.

alexru ★★★★
() автор топика
Ответ на: комментарий от Stil

Есть, но это трэш, угар и содомия по сравнению с *printf().

akk ★★★★★
()
Ответ на: комментарий от alexru

Переполнение буферов - неправда, можно запросить размер:

const char *fmt = "sqrt(2) = %f";
int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2));
std::vector<char> buf(sz + 1); // note +1 for null terminator
std::snprintf(&buf[0], buf.size(), fmt, std::sqrt(2));
+ есть snprintf

На счёт разной интерпретации компиляторами - по-моему это проблема компиляторов, функция стандартизирована, никаких разночтений быть не должно (не слышал о таких, sprintf редко использую).

pavlick ★★
()
Ответ на: комментарий от pavlick

Переполнение буферов - неправда, можно запросить размер:

Да понятно, что код можно безопасный писать при желании. Просто утверждается, что исполосовав код всякими «<<» и ".arg()" даже нарочно плохо не напишешь.

alexru ★★★★
() автор топика

Есть несколько реализаций на C++ Python-like функции format(). Спецификаторы указываются в самой строке, типобезопасность, портируемость, скорость сравнима с printf, что там тебе ещё нужно. Выбирай любую. Я так вообще в каждом проекте пишу заново, пока стандартной нет, это пара страниц кода всего.

E ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.