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

    +55

    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
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    bool validateIp(std::string& ip) {
        if( ip.length() == 0 ) {
            return false;
        }
        
        if( ip[0] == '.' ) {
            return false;
        }
        
        // Проверка на наличие 3 точек
        int cp = 0;
        for( int i = 0; i < ip.length(); i++ ) {
            if( ip[i] == '.' ) {
                cp++;
            }
        }
        if( cp != 3 ) {
            std::cout << "проверка на 3 точки" << std::endl;
            return false;
        }
        //=====================
        
        
        // Проверка на 2 точки подряд
        for( int i = 0; i < ip.length()-1; i++ ) {
            if( ip[i] == '.' && ip[i+1] == '.' ) {
                std::cout << "проверка на 2 точки подряд" << std::endl;
                return false;
            }
        }
        //===========================
        
        
        //Проверка на больше 3 цифр подряд
        int i = 0;
        int j = 0;
        for( i = 0; i < ip.length(); i++ ) {
            for( j = i; j < i+4 && j < ip.length(); j++ ) {
                if( j == i+3 && ip[j] != '.' ) {
                    std::cout << "проверка на 4 цифры подряд" << std::endl;
                    return false;
                }
                if( ip[j] == '.' ) {
                    i = j;
                    break;
                }
            }
        }
        
        return true;
        //============================
    }

    Валидация IP-адреса

    Запостил: lukaville, 17 Февраля 2015

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

    • а как на счет проверки на < 256?
      Ответить
      • а как насчет того что 0xC0.0xA8.0x01.0x01 или 0300.0250.0001.0001 тоже валидные ip адреса
        Ответить
        • или:
          ::192.168.1.1
          ::ffff:c000:0280
          Ответить
        • Более того. 0x7F000001 тоже валидный адрес. И его десятичная форма. И 127.1 вроде бы тоже...

          Где-то я тут постил регулярку для проверки айпишек. Но вот найти не могу :(
          Ответить
          • для v6:
            # IPv6 RegEx
            (
            ([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|          # 1:2:3:4:5:6:7:8
            ([0-9a-fA-F]{1,4}:){1,7}:|                         # 1::                              1:2:3:4:5:6:7::
            ([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|         # 1::8             1:2:3:4:5:6::8  1:2:3:4:5:6::8
            ([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|  # 1::7:8           1:2:3:4:5::7:8  1:2:3:4:5::8
            ([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|  # 1::6:7:8         1:2:3:4::6:7:8  1:2:3:4::8
            ([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|  # 1::5:6:7:8       1:2:3::5:6:7:8  1:2:3::8
            ([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|  # 1::4:5:6:7:8     1:2::4:5:6:7:8  1:2::8
            [0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|       # 1::3:4:5:6:7:8   1::3:4:5:6:7:8  1::8  
            :((:[0-9a-fA-F]{1,4}){1,7}|:)|                     # ::2:3:4:5:6:7:8  ::2:3:4:5:6:7:8 ::8       ::     
            fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|     # fe80::7:8%eth0   fe80::7:8%1     (link-local IPv6 addresses with zone index)
            ::(ffff(:0{1,4}){0,1}:){0,1}
            ((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
            (25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|          # ::255.255.255.255   ::ffff:255.255.255.255  ::ffff:0:255.255.255.255  (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
            ([0-9a-fA-F]{1,4}:){1,4}:
            ((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
            (25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])           # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
            )
            
            # IPv4 RegEx
            ((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])
            Ответить
            • > IPv4 RegEx
              Фи! А как же 127.1 и прочие радости? :) Та регулярка всё согласно RFC проверяла... Само собой писал я ее just for lulz. Никто в здравом уме не будет тестить айпишники регулярками.
              Ответить
              • Ну кроме тех, что только вчера узнал регулярки и пытается использовать их везде.
                Ответить
            • Вот она: http://govnokod.ru/13663#comment192990
              Ответить
        • wat? hex? может сразу в WCT еще записывать IP начать?
          Ответить
          • Все операционки нормально работают со всеми перечисленными формами ipv4.

            Можешь попинговать 127.1, 0x7F.0.1, 0177.0.0.0x1 и убедиться.
            Ответить
            • причем возникает закономерный вопрос - что было в голове у тех мудаков, которые писали и согласовывали спеку
              Ответить
              • > что было в голове
                Каннабис как минимум. Но скорее всего что-то посильнее.

                P.S. Теперь всегда буду писать 127.1. Везде работает, очень кратко и рвёт шаблоны читателям.
                Ответить
          • Это да. Как же иногда бесит "универсальность", которая на самом деле - пучок разрозненных мнений с длинным списком исключений.

            Вот IPv4 было бы достаточно записывать одним способом - в виде [0-9]{1,3}(?:\.[0-9]{1,3}){3} (для адресов вида 283.496.528.999 для каждого числа оставлять младшие биты) или лучше в строгом шестнадцатеричном [0-9A-F]{2}(?:\.[0-9A-F]{2}){3} для взаимной однозначности, постоянной длины и элементарного парсинга.

            Но нет же, теперь провести валидацию IP правильно может только человек уровня Борманда.
            И для парсинга XML (ну, что могло быть проще XML и его <тег атрибут="значение" <!--комментарий--> />?) теперь надо Борманда вызывать.

            И даже в стандартном государственном документе те же люди умудряются поднасрать. Казалось бы, распечатал в стандартной программе, за написание и тестирование которой все дружно платили налоги, которая одна на всю Россию печатает одинаковые русские буквы для всех россиян. (http://habrahabr.ru/company/enterra/blog/219535/)
            Ответить
            • > Но нет же, теперь провести валидацию IP правильно может только человек уровня Борманда.
              Есть же готовые функции для этого. Они и ipv4 и ipv6 понимают. Не надо парсить ip, не надо парсить json, не надо парсить xml...
              Ответить
              • > Не надо парсить ip, не надо парсить json, не надо парсить xml...
                Вот я понимаю "не надо парсить C++, не надо парсить Haskell, не надо переписывать std::map".
                Но тут же просто какие-то четыре дурацких числа, разделённых точкой/двоеточием или элементарное дерево с угловыми или фигурными скобочками.

                Где в IP-адресе перегрузка операторов? Где в IP-адресе определение функций? Как добавить в IP-адрес элемент за линейное время?
                Ну, хорошо, как мне в IP-адресе переменную привести к инту?
                Что? Нет такого? А ведь можно написать интерпретатор брейнфака, уложившись в меньшее число строчек и получив гораздо большие возможности, чем хранение дурацких чисел.

                И теперь из-за дурацкой группы чисел или банального дерева с текстовыми узлами я должен тянуть в код чужие фунции, библиотеки и читать многотомные мануалы, рискуя словить непонятный баг из-за очередного неучтённого в библиотеке ненужного случая только потому, что кто-то не смог тупо решить, как записать 4 числа в строку.

                Это сука синие занавески, это сука просто четыре числа, нечего тут рассуждать про намерения автора, автор стандарта, просто пиши четыре числа с строку однозначно, сука!
                Ответить
          • Ога, и имена узлов отменить: GOOGLE --> 111.15.107.4
            Ответить

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