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

    +17

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    char stmt[1024];
    int offset = 0;
    // ...
    for ( int count = 1 ; ; )
    {
        offset += sprintf(stmt + offset , "$%d" , count);
        count ++;
        if ( count > p_max )
        {
            break;
        }
        offset += sprintf(stmt + offset , ",");
    }

    Сборка строки вида "$1,$2,$3,$4" для запроса к PostgreSQL.

    Q: Где здесь с++, bormand?
    A: Проект написан на с++.

    Запостил: bormand, 03 Сентября 2012

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

    • Где здесь говно, bormand? (Ну, за исключением цикла довольно странного вида).
      Ответить
      • 1) В цикле довольно странного вида.
        2) В использовании сяшных функций в коде на с++.

        P.S. Идиому sprintf-builder ругать рука не поднимется. Все-таки сяшный олдскул, а я его люблю.
        Ответить
        • Вот так хотя бы:
          for (int count = 1; count <= p_max; count++) {
              if (count != 1) {
                  offset += sprintf(stmt + offset , ",");
              }
              offset += sprintf(stmt + offset , "$%d" , count);
          }
          Ответить
        • > Q: Где здесь с++, bormand?
          > A: Проект написан на с++.
          > 2) В использовании сяшных функций в коде на с++.
          Так может это на самом деле Си код, который поместили в файлы .cpp и собирают плюсовым компилером?
          Ответить
    • А sprintf здесь очень даже няшка. Возьму на вооружение, правда в виде snprintf.
      Ответить
      • Раз уж проект на плюсах, то почему бы здесь не использовать stringstream?
        Ответить
        • > то почему бы здесь не использовать stringstream
          Вот и я о том же. Хотя, возможно, он будет чуть-чуть медленней, но это не так важно. Один фиг запросы исполняются намного дольше, нежели составляется.
          Ответить
          • P.S. А вот для С это неплохой прием (если переделать на snprintf конечно).
            Ответить
            • Bourne C legacy.

              Why is snprintf faster than ostringstream or is it?
              http://stackoverflow.com/questions/445315/why-is-snprintf-faster-than-ostringstream-or-is-it

              Писать на плюсах только с использованием плюсового функционала — «языковая целостность» или производительность?
              Ответить
              • stringstream сам управляет размером буфера. Так что «удобство и краткость». C snprintf все это придется реализовывать самому.
                Ответить
              • Кстати еще и безопасность - т.к. код в исходном варианте способен вызвать переполнение буфера (если функции передать неудачные параметры).
                Ответить
                • > 'неудачные параметры'
                  Шикарно.
                  Ответить
                  • Ну для нее, для разработчика и для пользователя они неудачные. А для злоумышленника - вполне удачные ;)
                    Ответить
    • Странно это, почему 721 борт не отписывается?
      Что-то задумал и помалкивает?
      Или чего-то не знаю?
      Ответить
      • 721 это я штоле?
        Типичное сишкоговно, что тут сказать...
        Ответить

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