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

Тема в разделе "C/C++/C#", создана пользователем Vunderkind, 28 окт 2010.

  1. Vunderkind

    Vunderkind Active Member

    Регистрация:
    26 окт 2010
    Сообщения:
    27
    Симпатии:
    0
    Вводится 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
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Хм... Громозко что то получилось.... Оптимизировать и думать дальше уже не охото...
    Код (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;


    }
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Вот реализация попроще, но те такая эффектная
    Код (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; //Удалим динамически выделенную память под строку

    }
     
Загрузка...
Похожие Темы - Проверка корректности адреса
  1. Anatoly
    Ответов:
    6
    Просмотров:
    4.749
  2. ghost
    Ответов:
    0
    Просмотров:
    149
  3. WebWare Team
    Ответов:
    0
    Просмотров:
    1.989
  4. Ruska132
    Ответов:
    12
    Просмотров:
    1.001
  5. k85
    Ответов:
    24
    Просмотров:
    1.745

Поделиться этой страницей