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

    +4

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    string TRASETXT::trace(string &a // получаемая строка ) 
    { 
        string b; // возвращаемая строка 
        stringstream s; // строковый поток 
        // переводит в втооом словосочетании все большие буквы в маленькие 
        for (unsigned int i = 0; i < a.size(); i++) // а - получаемая строка 
        { 
            int key = a[i]; 
            if ((key <= -33) && (key >= -64)) // от А до Я 
                key += 32; 
            if (key == -88) // только буква Ё 
                key = -72; 
            if ((key >= 65) && (key <= 90)) // от A до Z 
                key += 32; 
            s << (char)key; 
        } 
        getline(s, b); // получаем строку только из маленьких букв во временную переменную 
        s.clear(); // очищаем поток 
        return b; 
    }

    Увидел в курсаче у чувака, лучший метод преобразования строки в lowercase, везде буду использовать теперь и вам рекомендую

    Запостил: semoro, 23 Мая 2016

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

    • Что за магия с отрицательными кодами символов?
      Ответить
      • Магия юникода видимо
        Ответить
      • Видимо у него char - signed. Тогда отрицательные коды - это те, которые не ascii, а кодировко-специфичные.
        Ответить
        • Проводим эксперимент
          #include <iostream>
          
          using namespace std;
          int main(){
              string s = "тест";
              for(int i=0;i<s.size();i++){
                  cout << (int)s[i] << endl;
              }
          }

          Выводит
          -47
          -126
          -48
          -75
          -47
          -127
          -47
          -126
          Ответить
          • В чем соль эксперимента? У тебя утф-8, у автора говнокода - однобайтовая кодировка, очевидно.
            Ответить
            • мне это не очевидно. мне очевидно только то что автор думает что у него однобайтовая кодировка.
              Ответить
          • >Проводим экскремент
            В сишечке => крестах чар может signed или unsigned .
            Ответить
        • Вот интересно, будет ли у меня на Linux работать, ведь у меня не cp1251 а utf-8
          Ответить
          • Да, на линухе не прокатит(
            #include <iostream>
            
            using namespace std;
            int main(){
                string s = "ТЁСТ";
                for(int i=0;i<s.size();i++){
                    cout << (int)s[i] << endl;
                }
            }

            выводит
            -48
            -94
            -48
            -127
            -48
            -95
            -48
            -94


            А вот так
            #include <iostream>
            
            using namespace std;
            int main(){
                string s = "тёст";
                for(int i=0;i<s.size();i++){
                    cout << (int)s[i] << endl;
                }
            }

            выводит
            -47
            -126
            -47
            -111
            -47
            -127
            -47
            -126
            Ответить
        • Глянул таблицу cp1251, там используется зеркальная половина таблицы ASCII, т.е -1..-128, а char у него signed..
          Ответить
    • > getline(s, b);
      А перед этим разве не нужно сделать какой-нибудь rewind?
      Ответить
    • (string &a // получаемая строка )
      Ответить
      • Фоменок, иди напитон, фоменок!
        А вообще /**/.
        Ответить
        • Я пофиксил!
          string TRASETXT/*Название класса*/::trace/*название метода*/(string &a /* получаемая строка */ ) 
          {  // начало тела метода trace класса TRASETXT
              string /*тип - строка*/ b /*название переменной - b*/; // возвращаемая строка 
              stringstream /*тип - строковый поток*/ s /*название переменной - s*/; // строковый поток 
              // переводит в втооом словосочетании все большие буквы в маленькие 
              for (unsigned int i /* счётчик цикла беззнакового типа */ = 0; // инициализация счётчика цикла нулём
                  // продолжать цикл, пока счётчик цикла не достигнет длины строки a
                  i < a.size(); // выполнить сравнение счётчика цикла с
                      // результатом вызова метода size() строки a
                  i++) // Увеличивать счётчик цикла на 1 каждую итерацию цикла
                  // а - получаемая строка 
              {  // начало тела цикла for
                  int /*тип - число*/ key /*название переменной*/ = a[i]; // присвоить переменной key
                      // элемент строки a с индексом i
                  if ((key <= -33) && /*логическое И*/ (key >= -64)) // от А до Я 
                      key += 32;  // увеличить key на 32
                  if (key == -88)  // только буква Ё 
                      key = -72;  // присвоить key значение -72
                  if ((key >= 65) && /*логическое И*/ (key <= 90)) // от A до Z 
                      key += 32;  // увеличить key на 32
                  s << (char)key;  // интерпретировать key как символ и добавить его
                      // к строковому потоку s
              }  // конец тела цикла for
              // получаем строку только из маленьких букв во временную переменную 
              getline/*название функции*/(s, b)/*аргументы функции*/;
              // очищаем поток 
              s.clear(); // вызвать метод clear() строкового потока s
              return b; 
          }  // конец тела метода trace класса TRASETXT
          Ответить
          • int /*тип - число*/ key /*название переменной*/ = a[i]; // присвоить переменной key
            ...
            getline/*название функции*/(s, b)/*аргументы функции*/;


            инновативно!
            Ответить
          • Для универсальности можно использовать простой лексер*:
            function comment(code) {
              return code.replace(/('(?:\\.|[^'])*')|("(?:\\.|[^"])*")|(\/\*(?:[^*]|\*(?!\/))*\*\/|\/\/[^\r\n]*)|(#[^\r\n]*)|(\+\+|<<=|>>=|[~!%^&\*\-\+=?:<>\/\|]=|[~!%^&\*\-\+=?:<>\/\|])|(alignas |alignof |and|and_eq|asm|auto|bitand|bitor|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|false|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|not|not_eq|nullptr|operator|or|or_eq|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|true|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while|xor|xor_eq)(?![A-Za-z$_0-9])|([A-Za-z$_][A-Za-z$_0-9]*)|(0x\d+|\d+(?:\.\d*)?(?:[eE][+\-]\d+)?[Ff]?|\d*\.\d+(?:[eE][+\-]\d+)?[Ff]?|\d+[Uu]{0,2}[Ll])|([\[\(\{])|([\]\)\}])/g, function(_, character, string, comment, preprocessor, operator, keyword, identifier, number, opening, closing) {
                if(character) return '/* character */ ' + _;
                if(string) return '/* string */ ' + _;
                if(comment) return '/* comment */ ' + _;
                if(preprocessor) return '/* preprocessor directive */ ' + _;
                if(operator) return '/* operator */ ' + _;
                if(keyword) return '/* keyword */ ' + _;
                if(identifier) return '/* identifier */ ' + _;
                if(number) return '/* number */ ' + _;
                if(opening) return '/* opening bracket */ ' + _;
                if(closing) return '/* closing bracket */ ' + _;
                throw new Error('Unknown pitux: ' + _);
              });
            }

            * моя реализация не покрывает весь C++
            Ответить
            • -throw new Error('Unknown pitux: ' + _);
              +return '/* Unknown pitux */' + _;


              Теперь покрывает.
              Ответить
              • Нет. Эта питушня была только для самоконтроля. Регулярка матчит один из описанных крестотокенов и по построению хватает его в скобки. Поскольку токены непустые, результат должен обязательно проявиться в одном из аргументов. Исключение будет брошено только при ошибке в коде: если вдруг токен внезапно пустой или незахваченный, или аргумент в функции забыт. А неизвестный токен просто останется без комментария.
                Вот за что я беспокоюсь - так это диграфы, триграфы, всякие эскейп-питушни, \ в конце строки и хитрожопые операторы. Ну и вероятность неправильного порядка в описании грамматики (например, /a|ab/)
                Ответить
    • > s.clear(); // очищаем поток
      нахуй его чистить от ошибок, прстите?
      тем более, что он в следующей строчке и так сдохнет
      (автор ещё небось не знает, что ему нужен был stringstream.str("") для "очищаем поток")
      Ответить
      • Самая главная проблема этого кода
        Ответить
        • да, потому что это проблема другого качества
          ошибка проектирования STL, когда хуево назвали метод, и теперь он делает не то, что все ожидают (не читая документации)
          Ответить
          • > когда хуево назвали метод
            Да там в стримах 99% методов хуёво названы... Что стриму внушает метод imbue()?
            Ответить
            • очевидно, имбю
              Ответить
            • o imbue is to fill up with or become "soaked" in an idea or emotion, as a sponge takes in water. One visit to Africa might be enough to imbue ambitions in a medical student to return to heal the sick.
              Ответить
    • Я в одной дипломной работе видел js-комментарии - слеши В ОБРАТНУЮ СТОРОНУ.
      Ответить
      • Вот что винда с людьми делает...
        Ответить
        • Во всём виноваты прыщи, что бы это ни значило.
          Ответить
          • И в том, что мне тян не дают, тоже?
            Ответить
            • И в этом тоже
              Ответить
            • > мне тян не дают
              а кто тебе её должен дать?
              Ответить
              • Спортлото.
                Ответить
              • Дед Мороз на Новый год, очевидно же!
                Ответить
              • На др подарить1111
                Ответить
              • Ну, как правило, тян либо учатся вместе с обыкновенным школьником, либо откуда-нибудь сваливаются на него и переводятся в его школу, сводя задачу к предыдущей... В исключительных случаях тян в буквальном смысле находят на помойке.
                Ответить
                • Однажды японский кун пришел в школу и ничего не случилось
                  Ответить
                  • > ничего не случилось
                    А ведь этому посвящён целый жанр...
                    Ответить
                • А что если я уже закончил, а так ничего и не произошло?
                  Ответить
        • Видимо чел не догодался как в техе вставлять код, а // давал не то, что хотелось.
          Ответить
      • Они работали?
        Ответить
      • /* Страшнее всего /*/ когда комментарии вот такие */

        Потому что не знаешь, какой именно слеш препроцессор/компилятор посчитает их завершением.
        Ответить
        • препроцессор*/*компилятор
          Ответить
        • Джс не настоящий язык, в нем не препроцессора
          Ответить
          • препроцессор можно к чему угодно прикрутить
            можно генерить кодом на пехапе код на пехапе, генерящий код на жс
            Ответить
            • Только в си он в стандарте а в жопаскрипте нет
              Ответить

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