- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 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;
//============================
}
Lokich 17.02.2015 23:04 # +2
movaxbx 17.02.2015 23:30 # +1
lukaville 17.02.2015 23:35 # 0
::192.168.1.1
::ffff:c000:0280
bormand 17.02.2015 23:40 # +1
Где-то я тут постил регулярку для проверки айпишек. Но вот найти не могу :(
lukaville 17.02.2015 23:44 # 0
bormand 17.02.2015 23:47 # +1
Фи! А как же 127.1 и прочие радости? :) Та регулярка всё согласно RFC проверяла... Само собой писал я ее just for lulz. Никто в здравом уме не будет тестить айпишники регулярками.
kegdan 18.02.2015 07:24 # +2
bormand 17.02.2015 23:53 # +1
Lokich 18.02.2015 13:21 # +1
bormand 18.02.2015 13:45 # +2
Можешь попинговать 127.1, 0x7F.0.1, 0177.0.0.0x1 и убедиться.
defecate-plusplus 18.02.2015 13:50 # +3
bormand 18.02.2015 13:55 # +2
Каннабис как минимум. Но скорее всего что-то посильнее.
P.S. Теперь всегда буду писать 127.1. Везде работает, очень кратко и рвёт шаблоны читателям.
1024-- 18.02.2015 13:55 # 0
Вот 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/)
bormand 18.02.2015 13:57 # +1
Есть же готовые функции для этого. Они и ipv4 и ipv6 понимают. Не надо парсить ip, не надо парсить json, не надо парсить xml...
1024-- 18.02.2015 14:14 # +4
Вот я понимаю "не надо парсить C++, не надо парсить Haskell, не надо переписывать std::map".
Но тут же просто какие-то четыре дурацких числа, разделённых точкой/двоеточием или элементарное дерево с угловыми или фигурными скобочками.
Где в IP-адресе перегрузка операторов? Где в IP-адресе определение функций? Как добавить в IP-адрес элемент за линейное время?
Ну, хорошо, как мне в IP-адресе переменную привести к инту?
Что? Нет такого? А ведь можно написать интерпретатор брейнфака, уложившись в меньшее число строчек и получив гораздо большие возможности, чем хранение дурацких чисел.
И теперь из-за дурацкой группы чисел или банального дерева с текстовыми узлами я должен тянуть в код чужие фунции, библиотеки и читать многотомные мануалы, рискуя словить непонятный баг из-за очередного неучтённого в библиотеке ненужного случая только потому, что кто-то не смог тупо решить, как записать 4 числа в строку.
Это сука синие занавески, это сука просто четыре числа, нечего тут рассуждать про намерения автора, автор стандарта, просто пиши четыре числа с строку однозначно, сука!
heyzea1 18.02.2015 17:00 # +1
Но ведь это не так
Vasiliy 18.02.2015 19:46 # +1
kegdan 18.02.2015 21:05 # 0
myaut 19.02.2015 10:23 # 0