Программистское полуриторическое
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)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-09 12:08 am (UTC)no subject
Date: 2012-08-09 12:05 am (UTC)Полагается использовать всякие streams! Уже 20 лет как.
no subject
Date: 2012-08-09 12:09 am (UTC)no subject
Date: 2012-08-09 12:23 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2012-08-15 10:00 am (UTC)(no subject)
From:no subject
Date: 2012-08-09 12:24 am (UTC)Таким образом, предполагается, что существуют собаки, программирующие не на С++. :)
no subject
Date: 2012-08-09 12:38 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2012-08-20 04:35 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: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)
From:(no subject)
From:(no subject)
From:(no subject)
From:No title
Date: 2012-08-09 07:06 am (UTC)no subject
Date: 2012-08-09 11:24 am (UTC)no subject
Date: 2012-08-09 04:55 pm (UTC)no subject
Date: 2012-08-09 11:37 am (UTC)а если вам boost не стандарт, то я уж и не знаю.
no subject
Date: 2012-08-09 03:11 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-09 02:30 pm (UTC)http://en.wikipedia.org/wiki/Variable-length_array
int need = vsnprintf(buf, bufsize, form, al) + 1;
if (need <= bufsize) {
ret = buf;
} else {
char dyn[need];
vsprintf(dyn, form, al_copy);
ret = dyn;
}
no subject
Date: 2012-08-09 03:17 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2012-08-11 04:51 pm (UTC)no subject
Date: 2012-08-11 08:49 pm (UTC)Функциональностью и эффективностью, очевидно. Просто ради интереса, напишите эквивалент формата "%*.*s" на stringstream.
Если вылезти чучуть за пределы stdlib, то boost::format, а то и прям boost::spirit::karma.
Понятно, что на языке программирования общего назначения можно написать что угодно. Вопрос мой не в этом.
no subject
Date: 2012-08-12 04:55 pm (UTC)Ещё есть itoa, которую, по причине отсутствия её определения в стандартах ANSI C и C++ порой реализуют через stream. Ужасно... Столько лет эволюции языка, и на те.
Но нормальные девелоперы просто создают себе библиотеку для своего колхоза Тупик Коммунизма, работают, а не ноют. :-)