1. Си / Говнокод #22096

    −51

    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
    const char * c_version()
    {
      const char * hui = "hui";
      const char * pizda = "pizda";
      unsigned long huilen = strlen ( hui );
      unsigned long pizdalen = strlen ( pizda );
      char * sobaka = ( char* ) ::malloc ( (huilen + pizdalen) + 2 );
      strcat ( sobaka,hui );
      strcat ( ( sobaka + huilen ),"&" );
      strcat ( ( sobaka + huilen + 1 ),pizda );
      sobaka[huilen + pizdalen + 1] = '\0';
      return sobaka;
    }

    Склеиваем строки

    Запостил: Koshak90, 01 Февраля 2017

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

    • > Си
      > ::malloc

      А что, так можно?
      Ответить
      • не обращай внимания, это уже 1000 раз отредактированный оригинал, я прекрасно знаю что в C нет пространств имён
        Ответить
    • Открыл америку... Все знают, что стандартная либа в сях спартанская и уёбищная. Но ведь это и не язык высокого уровня, чтобы требовать мешок батареек в комплекте.

      Сделай свою либу для строк или найди готовую, раз так часто клеить приходится.
      Ответить
      • Дык проблема же решается в два sprintf'а

        const char* a = "hui", *b = "pizda";
        size_t len = snprintf(NULL, 0, "%s&%s", a, b);
        char* s = malloc(len+1);
        snprintf(s, len+1, "%s&%s", a, b);
        Ответить
        • разумеется решается. Любая микропроблема решается в несколько строк. А потом в коде 100500 повторений одних и тех же блоков с небольшими отличиями.
          Ответить
        • > Дык проблема же решается в два sprintf'а

          на большинстве человеческих систем - где поддерживается asprintf() - в одну.
          Ответить
          • а есть версия sscanf которая будет %s писать в буфер переменной длинны?
            Ответить
            • да - %ms - и уже даже в позикс:

              http://pubs.opengroup.org/onlinepubs/9699919799/functions/sscanf.html

              [CX] [Option Start] The %c, %s, and %[ conversion specifiers shall accept an optional assignment-allocation character 'm', which shall cause a memory buffer to be allocated to hold the string converted including a terminating null character. In such a case, the argument corresponding to the conversion specifier should be a reference to a pointer variable that will receive a pointer to the allocated buffer. The system shall allocate a buffer as if malloc() had been called. The application shall be responsible for freeing the memory after usage. If there is insufficient memory to allocate a buffer, the function shall set errno to [ENOMEM] and a conversion error shall result. If the function returns EOF, any memory successfully allocated for parameters using assignment-allocation character 'm' by this call shall be freed before the function returns. [Option End]
              Ответить
          • а еще есть obstack_printf которая тоже самое, но аллочит не в обычной куче, а где скажешь
            Ответить
        • Паттерн SnprintfBuilder.
          Ответить
        • нарешал те за щеку
          Ответить
    • говно тут больше наверное в том что люди думают что размер строки версии неопределеный и динамический и хер его знает еще что. это жабо-шарпщики в С программировать пытаются.

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

      ЗЫ или даже обычный строковый литерал:
      #define HUI "hui"
      #define PIZDA "pizda"
      #define HUI_TAI_LANG HUI "&" PIZDA

      и все остальное - включая ноль на конце - сделает за тебя компилер.
      Ответить
      • это ж работает пока строки не на вход функции подаются
        Ответить
        • с точки зрения софта, номера/строки версия как правило константы.

          на самом деле я подобные огороды как сверху видел. было очень смешно когда первые билды фирмваре не бутились потому что пулы/хипы еще не были проинициализированы, но статикой вызывалась генерация строки версии. и что бы все еще маразменней сделать, все было хардкожено (как и выше) в теле статического метода который эту строку динамически генерировал.
          Ответить
      • > размер строки версии неопределеный и динамический и хер его знает еще что
        Универсальное предположение.

        Я бы в наше время переходил на универсальный единообразный подход, а дела пирфоманса и вкомпиливание констант в код программы оставил бы компилятору. Чем меньше программист работает оператором байтов, тем больше у него времени на работу над алгоритмом.

        Хотя, в C++ даже аргумент без серьёзных размышлений просто так нормально не передашь.
        Ответить
        • > Чем меньше программист работает оператором байтов
          Тем больше он работает оператором джиры и менеджерского хуйца.
          Ответить
        • > Я бы в наше время переходил на универсальный единообразный подход, а дела пирфоманса и вкомпиливание констант в код программы оставил бы компилятору.

          такой код имеет тенденции, в long run:
          - требует сопровождения и поддержки
          - требует дополнительного тестирования

          как по мне, в мелочах и простых вещах, долгосрочно, лучше оставатся ближе к языку/ОС/стандартным библиотекам. и тестировать не надо, и поддерживать только по мелочам.

          в какой жабе или шарпе это еще терпимо - потому что сидят в некритичных прикладных облястях - там тест коверадж никто и не требует, и даже сервис/high авэйлабилити там тоже ограниченые ("бизнес хауэрс"). да и все равно все апдейтится и ребутится постоянно.

          > Чем меньше программист работает оператором байтов, тем больше у него времени на работу над алгоритмом.

          да. теперь в контексте этой мысли почитай историю PHP, языка и рантайма. почитай и поразмышляй как думали создатели PHP 20 лет назад.
          Ответить
          • > лучше оставатся ближе к языку/ОС/стандартным библиотекам. и тестировать не надо, и поддерживать только по мелочам.
            Оставаться ближе к языку - благо. Но если он сложный, лучше выбрать достаточное подмножество.
            Динамическая sobaka - это всё ещё обычный C/C++, только у программиста из головы бритвой Оккама вырезается необязательная абстракция.

            Оптимальный подход - доверять автоматике как можно больше задач для решения (т.к. автоматика не забудет, не устанет и будет работать одинаково хорошо), а затем делать тонкую подстройку там, где человек может сделать лучше, и это действительно необходимо. Правда, для этого нужны нормальные инструменты. У нас почему-то считают, что машина - говно по сравнению с профессионалом, и мастер руками сможет выжать больше, из чего вытекают недостаточно автоматизированные инструменты, которые без усилия человека производят некачественный продукт.
            То есть, грубо говоря, либо следи сам за всеми UB, сам решай, где статика, где динамика, где ссылка, где значение, ... - всегда напрягайся, и будет суперпирфоманс, либо дадим тебе язык, где нет UB, и всё неизменно передаётся по ссылке, непомерно пожирая процессор.
            Ответить
            • > Динамическая sobaka - это всё ещё обычный C/C++,

              1. когда последний раз видел обработку std::bad_alloc?
              2. "обычный С++" - этот язык на котором юникорны программируют или что?

              > либо дадим тебе язык, где нет UB,

              таки пересаживаем всех на Tcl и Haskell? или Rust?
              Ответить
    • Мне понравились хуилен и пиздален. Это наверное что-то типа полиэтилена и полипропилена.

      Собаколена не хватает.
      Ответить

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