Программистское полуриторическое
Aug. 8th, 2012 04:55 pmКакого, спрашивается, рожна этот велосипед приходится постоянно изобретать?
Почему он не в стандартной библиотеке с самого начала?
std::string format(const char * form, ...) {
const int bufsize = 1024;
char buf[bufsize];
std::string ret;
va_list al, al_copy;
va_start (al,form);
va_copy (al_copy, al);
int need = vsnprintf(buf, bufsize, form, al) + 1;
if (need <= bufsize) {
ret = buf;
} else {
char dyn[need];
vsprintf(dyn, form, al_copy);
ret = dyn;
}
va_end(al_copy);
va_end(al);
return ret;
}
no subject
Date: 2012-08-09 05:15 am (UTC)no subject
Date: 2012-08-09 05:37 am (UTC)no subject
Date: 2012-08-09 05:39 am (UTC)русскому языка говоритьсиплюсплюса программа писать?no subject
Date: 2012-08-09 05:42 am (UTC)no subject
Date: 2012-08-09 05:42 am (UTC):-)
no subject
Date: 2012-08-09 12:05 am (UTC)Полагается использовать всякие streams! Уже 20 лет как.
no subject
Date: 2012-08-09 12:08 am (UTC)no subject
Date: 2012-08-09 12:09 am (UTC)no subject
Date: 2012-08-09 12:23 am (UTC)no subject
Date: 2012-08-09 12:24 am (UTC)no subject
Date: 2012-08-09 12:24 am (UTC)Таким образом, предполагается, что существуют собаки, программирующие не на С++. :)
no subject
Date: 2012-08-09 12:38 am (UTC)no subject
Date: 2012-08-09 12:38 am (UTC)no subject
Date: 2012-08-09 12:42 am (UTC)Тогда возникает вопрос, куда именно воспрещен вход собакам и программистам. Типа "не на С++ вход запрещен собакам и программистам, а на гору Сион".
no subject
Date: 2012-08-09 12:51 am (UTC)(Лучше было бы "Собакам и программистам не на питоне вход воспрещен". Сразу представил себе собаку, пытающуюся оседлать питона, чтобы таки зайти...)
no subject
Date: 2012-08-09 04:17 am (UTC)no subject
Date: 2012-08-09 04:33 am (UTC)no subject
Date: 2012-08-09 05:41 am (UTC)Лучше вот так http://pastebin.com/G1KhB4jz
потом можно писать что-то типа
std::string string = StringFormatter() << "Text " << 567;
фактически, такую конструкцию можно использовать в любом месте где ожидается строка, автоматически прикастуется
no subject
Date: 2012-08-09 05:52 am (UTC)Пока я в принципе могу вызвать sprintf с теми же самыми свойствами, нет смысла создавать мне искусственные неудобства, намеренно не включая в стандартную библиотеку полезную функциональность.
Попробуйте написать строгий аналог формата "%*.*s", чтобы умел и отрицательные значения ширины поля. Интересно, во сколько строчек уложитесь.
no subject
Date: 2012-08-09 06:19 am (UTC)Я не совсем понимаю какого поведения есть желание добиться, .* - это число знаков после запятой, оно не относится к строкам.
no subject
Date: 2012-08-09 06:49 am (UTC)Да ну? Форматы фиксированной длины типа "%08X" еще никто не отменял.
.* - это число знаков после запятой, оно не относится к строкам.
man printf, да?
No title
Date: 2012-08-09 07:06 am (UTC)no subject
Date: 2012-08-09 08:14 am (UTC)Я согласен, но практика показывает, что код после написания попадает в руки менее опытных/внимательных людей, которые дорабатывая его согласно новым спекам, обязательно выйдут за границы буфера. Баг может быть не обнаружен даже при тестировании, однако проявиться потом в каких-то специфических условиях, при которых добавленная в формат строка будет иметь достаточную длину.
man printf, да?
Да, не нашел сходу. Тем не менее, какого поведения нужно достичь с отрицательными значениями? Очень похоже на то, что это gcc-specific.
no subject
Date: 2012-08-09 08:52 am (UTC)Не дело стандарта языка меня от этого защищать. Static analysis tools для этого есть.
Тем не менее, какого поведения нужно достичь с отрицательными значениями?
Точно такого же, как явный знак минус. Выравнивание влево.
no subject
Date: 2012-08-09 11:24 am (UTC)