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

    +175

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    string user="Администратор";
        char* qwe1;
        int i=0;
        for(i=0;user[i]!=0;i++){};
        qwe1[]=new char[i];
        for(int j=0;user[j]!=0;j++)qwe1[j]=user[j];

    перевод std::string в массив чаров

    Запостил: niXman, 30 Октября 2010

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

    • Кто-то, похоже, питает ненависть к стандартной библиотеке. Сколько автору лет?
      Ответить
      • хз сколько ему лет.
        да и ненависть тут не при чем. просто он не знает чего хочет :)
        Ответить
      • не всегда качество кода зависит от количества лет его написавшего..
        Ответить
        • код, который писали 40 лет обязан быть лучше кода, который писали 13 лет :-)
          Ответить
          • Если аффтар не докурил мануал - то не обязан...
            Ответить
            • Преимущества возраста очевидны.
              В 40 лет перед носом несогласных можно потрясти партбилетом писькой многолетним опытом. В тринадцать же лет трясти почти нечем.
              Ответить
              • Разве от трясения писькой опытом что-нибудь меняется?
                Ответить
                • показать все, что скрытоМм... Мне сейчас 16 скажем... и я в состоянии помериться пиписькойопытом с "дедами".
                  Ответить
                  • Школьнег детектед!
                    Ответить
                  • Оп-паньки. Detected.
                    Ответить
                  • А минусы мне за чистосердечное?
                    Ответить
                    • За "Мы - основа рунета". Поставь мне минус, если тебе от этого легче станет.
                      Ответить
                      • Меня пугает, что если сказать сколько мне лет, то обязательно будут обращаться как с неадекватной школотой....
                        Ответить
                        • Школота - это скорее, результат деятельности мозга нежели биофизиология
                          Ответить
                          • Знаю. Но повод я не подавал, а обращение имеет место быть:
                            >>Поставь мне минус, если тебе от этого легче станет
                            Ответить
                        • сказать "сколько мне лет",
                          и сказать "Мне сейчас 16 скажем... и я в состоянии помериться пиписькойопытом с "дедами"" не одно и то же. и правильно делают что минусуют.
                          Ответить
                  • и у Вас более десяти лет опыта программирования под linux, не так ли?
                    Ответить
                  • гыгы))
                    давай померимся ;)
                    какие условия?
                    Ответить
                    • Я весь этот срач начал к тому, что возраст - это далеко не главное.

                      Я понимаю, что за 4 года сознательной жизни я успел выучить пописАть только 3 языках, причем один из которых "паскаль для лицея".
                      Но все же я говнокодю куда реже, чем средний студент, и только по уважительной причине, как лень.

                      А вообще - я вчера был в говно и злой на весь мир....
                      Ответить
                      • > я вчера был в говно
                        Да, ты ещё школяр, раз оправдываешься этим.
                        Ответить
                        • лицеита!
                          напомните мне, что такое "лицей"? ПТУ? СПТУ?
                          Ответить
                          • "илитный" вариант школы.
                            Ответить
                          • http://ru.wikipedia.org/wiki/ФТЛ

                            А нажраться поводов хватает....
                            Ответить
                            • бывшая средняя школа № 13

                              А расскажите чего пили, чем закусывали...
                              Ответить
                              • *вздохнул* Задетектили школьника и айда подначивать. Кагбе взрослые дяди воспитывают подрастающее поколение, нажимая мышкой на крестик и гордясь своей взрослостью, блеать. Предсказуемо и занудно до ужаса.
                                Ответить
                                • согласен. но и школьник хорош, да.
                                  Ответить
                                  • seonull
                                    [*разнылся_и_убежал*]
                                    Не путайте понятия "школьник" и "идиот". Возраст к моему неадекватному поведению никак не относится).....

                                    p.s. Вы давно труъ школьников не видели? Я ж "вычислю тебя по айпи и сделаю что-нибудь плохое".
                                    Ответить
                                • >Задетектили школьника
                                  Просто не часто бывает когда "школьник" действительно школьник.
                                  Это как выиграть в лотерею. Сразу не верится.
                                  Ответить
                                  • >>Это как выиграть в лотерею.
                                    Особенно когда школьник сам признается в этом, тем самым представляя, какой словесный высер затем последует и показывая абсолютное к этому безразличие.

                                    Я повторюсь, мне абсолютно без разницы на мнение первокурсников (а местами и старше), считающими что унижая школьника - они выглядят умнее, главное - это моя мысль, а она заключается в следующей фразе:
                                    >>>возраст - это далеко не главное.
                                    Ответить
                              • сразу видно, что в этой школе пьют и закусывают совсем не тем чем, к примеру в http://govnokod.ru/4470
                                Ответить
                            • > А нажраться поводов хватает....
                              У меня таких поводов совсем нет. (в смысле - совсем не пью)
                              Ответить
                        • Почему же сразу оправдываюсь?
                          Вчера немного не ясно выразил свои мысли :-\
                          Ответить
    • Безотносительно того, в какой класс поступил KirAmp в этом году, продолжение говнокода обещает быть великолепным, т.к. захардкожен дефолтный привилегированный аккаунт винды
      к сожалению продолжение не опубликованно http://forum.vingrad.ru/index.php?showtopic=313888&view=findpost &p=2239480
      Ответить
    • Что за бред вообще? Особенно в 5ой строке.
      char* cstring = new char[user.length()+1];
      strcpy( cstring, user.c_str() );
      Ответить
      • просто какой-то идиот посоветовал новичку почитать Страуструпа, не объяснив что это и зачем. Вот так и появляется подобный код.
        Ответить
        • а страуструп тут при чем?
          Ответить
          • >а страуструп тут при чем?
            при С++
            Ответить
            • если следовать вашей логике, то Страуструп виноват в том, что кто-то не знает с++ и STL, и следовательно, в с++ коде(из-за своего невежества) хочет использовать функции Си? :lol
              Ответить
              • Я не говорил, что он в чем-то виноват. Я всего лишь напомнил о связи "с++ и Страуструп".
                Ответить
        • Ну я бы не назвал совет почитать Страуструпа идиотским :) Многое зависит от исходных знаний. Вот например своей кошке я не буду советовать читать Страуструпа: потому что 1) Нет базовых знаний по программированию, хотя бы даже процедурному; 2) Она всё таки баба 3) Да и читать не умеет (хотя кнопки на клаве жмет по полной программе)
          Ответить
          • кстати. последняя книжка Страуструпа: "программирование принципы и практика использования c++", очень даже для новичков. точнее совсем для новичков ;)
            Ответить
          • Ну там много примеров вроде такого while(*pStr2++ = *pStr1++); Советовать прочитать можно, просто нужно объяснить, что это больше информация для общего развития, чем "руководство к действию".
            Ответить
    • Мне показалось или тут попытались создать массив указателей? (или я не понял смысла зацикленного new)
      Кстати я бы вот такой говнокод написал бы:

      #include <string.h>
      #include <assert.h>
      char *str="to be or not to be";
      char *str2=new char[strlen(str)+1];
      assert(str2 != 0);
      strcpy(str2, str);
      Ответить
      • Нет, тут пытались скопировать std::string в char[].
        for(i=0;user[i]!=0;i++){}; //здесь определяли длину строки
        qwe1[]=new char[i]; //тут пытались выделить память под массив char
        for(int j=0;user[j]!=0;j++)qwe1[j]=user[j]; //и побайтово копировали

        Хотя проще так:
        std::string s1("admin");
        char * s2 = new char[s1.length()];
        strcpy(s2, s1.c_str());

        или вообще пользоваться string.
        Ответить
        • показать все, что скрытодаже не стал вдумываться, ибо не вижу ни одной причины делать "это".
          во первых - потому что в коде на с++ небезопасно использовать функции Си.
          во вторых - ибо не могу придумать ситуацию, когда нужно именно создать копию строки в виде массива байт, в с++.
          Ответить
          • >не могу придумать ситуацию, когда нужно именно создать копию строки в виде массива байт, в с++.
            Ну например при взаимодействии С++ и С. Передаешь из std::string, а сохраняешь в виде char[].
            Ответить
            • зОчем?
              string::c_str() чем не устраивает? этот метод был добавлен именно для совмещения с Си кодом.
              хотя сама идея в с++ коде использовать что-то написанное на Си - нелепа.
              Ответить
              • >strcpy(s2, s1.c_str());
                Вот это и есть создание копии в виде массива.
                Я же не про идиотские попытки преобразования как в ГК говорю :)
                Ну, представьте у вас есть некая рукописная библиотека на чистом С, и вам нужно использовать ее в С++ проекте, будете переписывать ее по новой?
                Ответить
                • показать все, что скрытоа зачем копию создавать?
                  при том, не завернутую в смарт поинтер?
                  Ответить
                  • Ну-ка про смарт поинтер поподробнее можно ( в данном контексте ) ?
                    Так если библиотека например изменяет значение строки, как тут без копии обойтись.
                    Ответить
                    • показать все, что скрыто> Ну-ка про смарт поинтер поподробнее можно ( в данном контексте ) ?
                      читаем: http://ru.wikipedia.org/wiki/RAII

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

                      вопросы? ;)
                      Ответить
                      • выражение в скобочках про контекст вас не смутило совсем? речь о взаимодействии с С идет, при чем тут RAII? Библиотека никому ничего не должна, тем более если она четко документирует свое поведение. Неужели так сложно представить например функцию, которая, скажем меняет буквы 'a' на 'b' внутри строки (char*), зачем при этом делать копию, можете объяснить?
                        > если некоторая функция библиотеки просит неконстантный указатель(или не указатель на константу), то создателя такой библиотеки уверенно можно считать дауном.
                        strcpy();
                        Ответить
                        • показать все, что скрыто> при чем тут RAII?
                          std::shared_ptr<char> ptr(new char ...);
                          any_func(ptr.get());

                          > strcpy();
                          она не выделяет ресурсы
                          Ответить
                          • Косяк, однако. Массив нужно в shared_array или scoped_array оборачивать, а не в shared_ptr.
                            Ответить
                        • показать все, что скрытохз что вы хотите мне доказать...
                          Ответить
                          • Зачем доказывать? Есть же умные книжки :)
                            Вот вы хорошо сказали "ресурс должен освобождаться на том же уровне где был создан/выделен".
                            А то, что копию строки (так яростно обсуждаемой) надо делать ДО вызова функции (которая ее изменяет), так и не поняли. Начали ООП сущности привлекать зачем-то, типа smart ptr и RAII. Всё же на поверхности лежит.
                            Ответить
                    • показать все, что скрытовам бы стоило купить несколько умных книжечек, и перестать задавать глупые вопросы ;)
                      Ответить
                      • из-за собственных заблуждений многое может показаться глупым :)
                        Ответить
        • >new char[s1.length()];
          байт потеряли :)
          Ответить
          • А-а-ах, фак мой мозг :-)
            Спасибо, точно, забыл нулевой))
            Ответить
      • Какой смысл в "assert(str2 != 0);" ???
        Или вы думаете при отладке память проверять после new актуально, а в релизе - уже нет ?
        Ответить
        • показать все, что скрытоНе собираю релиз-версии, ибо необходимости никогда не было.
          ---
          Допускаю, что память может не выделиться. Откройте "Как программировать на C++" Дейтела и Дейтела и увидите ассерт после каждого нью плюс рекомендации по этому поводу.
          Ответить
          • > Не собираю релиз-версии, ибо необходимости никогда не было.
            Ужос !!! Надеюсь, у вас все еще впереди.
            Т.е. вылет у пользователя с ассертом, это лучше, чем вывод соответствующего сообщения, создания дампа памяти и отправки его потом разработчику?
            Ответить
          • Дятел и Дятел? Заботятся о нас и нашем здоровье?
            Ответить
          • new в случае невозможности выделения памяти кидает std::bad_alloc
            Ответить
            • Зависит от того с какой либой собирать. Можно и без exception.
              Ответить
    • strcpy() небезопасна? Только при неграмотном использовании.
      P. S. Что за срач? Не использовать Си в программе на Си++ можно, но часто нарушается правило "Бритва Оккама" ("не плоди сущности без необходимости") .
      Ответить
      • А в самом С++ в довесок ещё можно привести пример небезопасного использования итераторов на разные контейнеры при задании интервала. При всём при том, что типы-то совпадают.
        Ответить
      • > Не использовать Си в программе на Си++ можно, но часто нарушается правило
        вы неверно понимаете правило.
        в реале, никогда не приходилось в с++ коде использовать функции из Си.
        Ответить
        • > в реале, никогда не приходилось в с++ коде использовать функции из Си.
          Даже memcpy() ?
          Ответить
          • ничего из Си.
            memcpy - std::copy<>
            в стандартных алгоритмах есть все: http://www.cplusplus.com/reference/algorithm/
            Ответить
            • А зря, memcpy() побыстрее будет, если POD-типами оперировать.
              Ответить
        • Даже ftok()?
          Ответить
    • Вот так и получается PHP.
      Ответить

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