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

    +57

    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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    #include <string>
    
    std::string SearchPushString(char StartVkPage[])
    {
    	char push[] = {'p','o', 's', 't'};
    	char http[] = {'h','t', 't', 'p'};
    	unsigned int* ipush = (unsigned int*)push;
    	unsigned long j = 0;
    	do
    	{
    		char* p = &StartVkPage[j];
    		unsigned int* nextFourSymbol = (unsigned int*)p;
    		if(nextFourSymbol[0]==ipush[0])
    		{
    			if(*p=='p')
    				ipush = (unsigned int*)http;
    			else
    			{
    				char* postString = new char[650];
    				memset(postString,0,650);
    				short int u = 0;
    				do
    				{
    					postString[u] = p[u];
    				}
    				while(p[++u]!='"'&&u!=650);
    				std::string url(postString);
    				delete [] postString;
    				return url;
    			}
    		}		
    	}
    	while(StartVkPage[j++]);
    	return std::string("error");
    }

    Я все никак не выучу регулярных выражений, ИЧСХ - обхожусь.

    Запостил: Psionic, 06 Апреля 2014

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

    • Регулярные выражения не нужны. Кроме шуток.
      Ответить
      • да. но жизнь облегчают значительно. подтормаживают - но все равно очень полезны.

        в данном случае код и так извратный - и дырявый. регулярки автору бы однозначно помогли.
        Ответить
      • А лексический анализ (токенизацию) чем проводить?
        Ответить
        • FSM, которые кодо-генерятся.

          лексеры это именно то место где регулярками никто не пользуется. потому что производительность сразу в ж. `n` возможных токенов проверяются `m` (длина ввода) раз - это достаточно близко к квадратичной производительности.
          Ответить
          • Ну тот же флекс он по сути и есть регулярки. Просто FSM генерится из всех регулярок сразу, а не по одной.
            Ответить
            • регулярки есть просто описание ожидаемого входа. в конце концов, реглярка это есть не что иное как "описание множества строк."

              внутри этого конечного автомата проверки делаются уже без регулярок.
              Ответить
          • Но ведь конечные автоматы и регулярные выражения эквивалентны (если не рассматривать всякие расширения последних).
            Ответить
            • мат часть:
              регулярка - это есть множество строк.
              проверка регулярки - проверка является ли строка членом этого множества.
              типичная реализация регулярок - автомат, динамически генерируемый в памяти.

              лексер как правило состоит из множества токенов. каждый токен регулярка. после генерации ты из кучи автоматов создается один, что бы каждый раз ввод проверять не через Н автоматов, а только через один. и часто этот автомат создается статически (а не динамически) и еще в добавок оптимизируется компилятором. но если это производительность не нужна, то можно и ручками, конечно.
              Ответить
              • >лексеры это именно то место где регулярками никто не пользуется.
                >лексер как правило состоит из множества токенов. каждый токен регулярка.
                Так всё же?
                Ответить
                • лексеры часто описываются регулярками (lex/flex), но в реализации еще ни разу не видел что бы использовались регулярки. ы?
                  Ответить
                  • Ну дык программист, юзающий flex, работает именно с регулярками. А во что там это скомпилится - его не особо волнует, лишь бы быстро работало...

                    Т.е. все-таки регулярки при токенизации используются :)

                    Короче спор ни о чем.
                    Ответить
                  • Какая реализация? Регулярное выражение - это лишь форма записи, а не алгоритм. Для проверки соответствия строки регулярному выражению нужен "дополнительный" алгоритм, будь то конечный автомат или что-то ещё.
                    Ответить
              • Ответить
          • Ответить
    • показать все, что скрытоcleaned
      Ответить
    • Ответить
    • // задача в том, чтобы найти первую строчку вида post "http://some/url"?
      // раз уж за каким-то хером работаем с сишными строками
      // то можно юзать сишные strstr и strchr из <cstring>
      std::string SearchPushString(const char * StartVkPage) {
          const char * post_pos = strstr(StartVkPage, "post");
          if (post_pos) {
              const char * http_pos = strstr(post_pos + 4, "http");
              if (http_pos) {
                  // не совсем эквивалентно
                  // зато не налетает на UB, если в конце строки нет кавычки
                  const char * quote_pos = strchr(http_pos + 4, '"');
                  if (quote_pos) {
                      // у стринга есть вот такой замечательный конструктор
                      // не надо самому копировать посимвольно ;)
                      return std::string(http_pos, quote_pos - http_pos);
                  }
              }
          }
      
          return "error";
      }
      Ответить
      • cleaned
        Ответить
      • Показал класс, bormand видит свою миссию в сеянье светлого - не иначе.
        Ответить
        • > bormand видит свою миссию в сеянье светлого - не иначе
          Не, я же злобный ханжа, любящий самоутверждаться за счет унижения людей (но при этом делающий вид, что помогает им) и глядящий на них как на говно.

          P.S. Может быть вместо return "error" стоит выбросить исключение?
          Ответить
        • cleaned
          Ответить
    • > char* postString = new char[650];
      НА-ХУ-Я
      Ответить
      • > memset(postString,0,650);
        А-НА-ЛО-ГИЧ-НО.

        Ради одного нолика весь массив забивать нулями...

        Да еще и цикл, который там ниже по тексту, забагуется и вылезет за границы буфера, если закрывающей " нету.

        P.S. Я чуть выше написал как правильно превращать кусок const char * в std::string.
        Ответить
      • Нахуя что? Ну буферок создаю.
        Ответить
        • Нахуя буферок создаешь? :)
          Ответить
          • Потому что сперва пишу код, а потом читаю документацию.
            Ответить
    • cleaned
      Ответить
      • Поставь себе на локалхосте форум, насели его ботами и занимайся там модерастией сколько душе угодно ;)
        Ответить

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