1. C++ / Говнокод #9596

    +158

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    // easy-to-use function for use printf-formatting with stl-strings
    std::string StrFormat(const char* fmt,...);
    
    void MakeBackup(const char* dataTime)
    {
    	std::string name = StrFormat("%s", dataTime);
    	...
    }

    Запостил: lifemaker, 03 Марта 2012

    Комментарии (8) RSS

    • BakeMakeup()
      Ответить
    • есть мнение, что вот эта easy-to-use fuckntion for use printf-formatting наверняка достойна отдельного ГК
      Ответить
      • на самом деле нет. нормальная там имплементация.
        сама идея этой функции чуток спорная. но для использования в некритичных местах - удобна и надёжна.
        если интересно имплементацию посмотреть - она здесь http://sourceforge.net/projects/popcapframework/
        у нас чуток допиленная версия, но принципиальных изменений там нет
        Ответить
        • посмотрел
          автор в цикле выделяет буфер, пишет в него через vsnprintf, и смотрит, всё ли влезло, если не влезло - realloc буфера в 2 раза больше, повторить
          это всё описывается в файле Common.h/.cpp, где кроме вышеописанного есть еще примитивы работы со строками, с xml, файловой системой, ГПСЧ, велосипед для htonl/htons, в общем, крайне полезный файлик, здорово, что всё нужное сразу в нем
          всё это обёрнуто в namespace Sexy {...}
          еще немножко, простите:
          #define sexystrncmp			strncmp
          #define sexystrcmp			strcmp
          #define sexystricmp			stricmp
          #define sexysscanf			sscanf
          #define sexyatoi			atoi
          #define sexystrcpy			strcpy
          typedef std::string   SexyString;
          typedef SexyString::value_type   SexyChar;
          #define HAS_SEXYCHAR

          вот ведь что спермотоксикоз с людьми делает
          Ответить
          • Достойно отдельного говнокода.
            Ответить
          • Вот тебе и нормальная имплементация
            Ответить
            • можешь предложить имплементацию лучше?
              Ответить
              • прежде всего, использовать *printf под с++ плохо, т.к. это небезопасно и работает только с POD типами
                если очень очень очень хочется форматированного вывода, то советую обратить внимание на boost::format, это C++-way, типобезопасно и вообще гораздо богаче функционал

                ну а под тёплой ламповой сишечкой в некоторых системах (началось с *bsd, затем вроде glibc подтянулся) есть *asprintf, которая сама выделит буфер - обычно реализовано через vfprintf в файл/поток, расположенный в памяти
                в стандарте она отсутствует, но типобезопасность там такая же никчемная
                Ответить

    Добавить комментарий