Проверка корректности Ip адреса

Vunderkind

Active member
26.10.2010
27
0
#1
Вводится IP адрес Интернета который состоит из трех чисел(в диапозоне от 0 до 255) разделенных точками.При этом длина последовательности(т.е длина чисел и точек ) не должна быть больше 15 символов.Если введеный IP адрес правильный выводится "1", иначе "0" Примеры:
1- пример

Ввод
255.00.255.255
Вывод
1
-------------------------------------------------------------------------------------------
2-пример
Ввод
192.168.0.01
Вывод
1
------------------------------------------------------------------------------------------
3-пример
Ввод
127.0.0.0
Вывод
1
------------------------------------------------------------------------------------------
4-пример
Ввод
256.0.0.1
Вывод
0
 

DarkKnight

Well-known member
01.08.2010
653
0
#2
Хм... Громозко что то получилось.... Оптимизировать и думать дальше уже не охото...
C++:
#include <iostream>

using namespace std;

void main(void)
{
setlocale(LC_ALL,"Russian"); //Установка локали

int IP[4]; //Массив с сегментами IP
char buffer[20]; //Буферная переменная
int CountIp = 0;
char* NotInt;
int current;

cout<<"Введите Ip : "; //Диалог ввода IP
gets(buffer); //Получение строки

char *b = buffer; //Указатель на буфер
bool isIp = true; //Предположим что синтаксис введенного IP - верен

while (strstr(b,".")) //Пока есть хоть одна субстрока из символа "."
{
char *k = new char[100]; //Создадим динамическую строку
memset (k,0,100); //Обнулим ее т.к. будем использовать strncpy

strncpy(k,b,strlen(b) - strlen(strstr(b,"."))); //Скопируем в k строку из b длиной b - длина от первого вхождения "."
b = strstr(b,"."); //Сместим указатель на "."
b++; //И проскочим ее

current =strtol(k,&NotInt,10); //Попробуем приобразовать в целочисленное число
if (!*NotInt) //Если не вернуло NULL - то значит число там есть
{
if ((current >=0 && current <256) && CountIp<3) //Число в пределах от 0..255 И кол-во сегментов не превысило 3... (это макс. кол-во
{											  //Сегментов которое наш цикл определит так как последний сегмент уже на конце "." - Не имеет
IP[CountIp] = current; //заполним сегмент в массив
CountIp++; //Увеличим счетчик найденых сегментов
} else isIp = false; //Иначе у нас не IP
} else isIp = false; //И если там нет целочисленного числа - то тоже не IP

delete[] k; //удалим созданую динамическую строку

if (!isIp) break; //Если мы уже поняли что правельного IP в строке нету то выйдем из цикла 
}

current =strtol(b,&NotInt,10); //Если в цикле было все хорошо у нас осталось последнее число на которое указывает b
if (!*NotInt && isIp) //Сделаем еще раз проверку
{
if (current >=0 && current <256)
{
IP[CountIp] = current;
} else isIp = false;
} else isIp = false;

if (isIp) //Если введен IP выведим код 1 и сам IP
{
cout<<"Return code 1"<<endl;
for (int i=0;i<4;i++)
{
cout<<IP[i]<<" ";
}
}
else cout<<"Return code 0"<<endl;


}
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
Вот реализация попроще, но те такая эффектная
C++:
#include <iostream>

using namespace std;

void main(void)
{
setlocale(LC_ALL,"Russian"); //Установка локали

int IP[4]; //Массив с сегментами IP
char buffer[20]; //Буферная переменная
int CountIp = 0;
char* NotInt; //Для strtol
int current; //текущий номер сегмента

cout<<"Введите Ip : "; //Диалог ввода IP
gets(buffer); //Получение строки

char *b = new char[20]; //выделим память под строку 20байт (20 символов)
memset(b,0,20); //Обнулим ее сразу

bool isIp = true; //Предположим что синтаксис введенного IP - верен

int cnt =0; //счетчик в строке в которую пишим цифру сегмента
for (int i=0; i <= strlen(buffer); i++) //Цикл от начало строки до первого символа завершения строки
{
if(buffer[i]=='.' || buffer[i] == 0) //Если символ точка или завершающий символ строки ТО
{
current =strtol(b,&NotInt,10); //Проверим на содержание в строки целочисленного числа
if (!*NotInt && CountIp < 4) //Если вернулось NULL, то число содержится
{
if (current >=0 && current <256) //Проверим на диапозон
{
IP[CountIp] = current; //Запишим в массив
} else 
{ 
isIp = false;
break; 
}
} 
else 
{
isIp = false;
break;
}
memset(b,0,20); //Обнулим строку
cnt=0; //Счетчик строки тоже поставим в 0
CountIp++; //Увеличим кол-во Ip-которые получили
}
else //Иначе пишим в строку символ из буфера
{
b[cnt++] = buffer[i];
}
}

/*ВЫВОД НА ЭКРАН РЕЗУЛЬТАТ */
if (isIp) //Если введен IP выведим код 1 и сам IP
{
cout<<"Return code 1"<<endl;
for (int i=0;i<4;i++)
{
cout<<IP[i]<<" ";
}
}
else cout<<"Return code 0"<<endl;

delete[] b; //Удалим динамически выделенную память под строку

}