Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
Fleurgen
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 20
#1

Проверка на IP-адрес - C++

14.12.2010, 23:31. Просмотров 2136. Ответов 12
Метки нет (Все метки)

Написать программу - Проверить является ли введенная строка IP адресом
Фишка в том, что нужно пускать на проверку с использованием
strpos для нахождения подстроки меду точками,
isnum чтобы проверить цифры,
atoi чтобы исключить лишнее

никак не могу реализовать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2010, 23:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на IP-адрес (C++):

Функция возвращает адрес , как передать этот адрес другой функции ? - C++
const int max = 5; double * fill_array(double, int); void show_array(const double, double *); // как передать этой функции в...

Адрес объекта, адрес указателя. Где что находится? - C++
#include <iostream> void Foo(int* val) { std::cout << val << " " << *val << " " << &val << '\n'; } void Bar(int* &val) ...

Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив равны. - C++
Убедиться, что адрес первого элемента массива и адрес, хранящийся в указатели на этот массив - равны.

Вычислить адрес верхушки стека, адрес следующей команды, адрес переменной, адрес которой содержится в BX - Информатика
Помогите решить следующие задачи: 1.Вычислить адрес верхушки стэка. 2.Вычислить адрес следующей выполняемой программы. 3. Вычислить...

Проверка строки на IP адрес - C++ Builder
Пишу клиент-серверную программу, получилось таким образом, что IP сервера на клиентской стороне имеется в строковом типе. Присваиваю его в...

MySQL Проверка на повторный IP адрес - PHP БД
Добрый вечер! Решил сделать в коде проверку на IP адрес, смысл такой, если сегодня пользователь заполнил форму у него записался IP адрес,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.12.2010, 10:35 #2
есть strtol(), у неё есть возможность узнать, где она остановилась
Fleurgen
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 20
15.12.2010, 15:25  [ТС] #3
Понятно. Но как это реализовать? На примере. Я в си недавно начал изучать.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
15.12.2010, 16:01 #4
слегка по быдлокодерски, но общий смысл должен быть понятен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<cstdlib>
int main(){
    char IP[16];
    char* endptr;
    long int a;
    std::cout<<"Enter string: ";
    std::cin>>IP;
    if(a=strtol(IP,&endptr,10))
        if(a>=0&&a<=255){
            int i;
            for(i=0;i<3;i++){
                ++endptr;
                if(!(a=strtol(endptr,&endptr,10))||!(a>=0&&a<=255)){
                    std::cout<<"String is not IP";
                    break;
                }
            }
        if(i<3)
            std::cout<<"String is not IP";
        else 
            std::cout<<"String is IP";
        }
        else
            std::cout<<"String is not IP";
    else 
        std::cout<<"String is not IP";
    std::cout<<std::endl;
    return 0;
}
Добавлено через 2 минуты

Не по теме:

что-то в Notepad++ нормальные отступы были, а на форуме вон какие получились...

silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
15.12.2010, 16:24 #5
Kastaneda, где нибудь в настройках стоит галочка "Использовать табуляцию" или что-то в этом роде. Если убрать её, табуляция будет заменяться на пробелы и во всех программах отступ будет такой, какой был изначально.
Kastaneda
15.12.2010, 16:33
  #6

Не по теме:

да, есть чекбокс "заменить пробелами"

Fleurgen
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 20
15.12.2010, 19:49  [ТС] #7
спасибо,конечно. но теперь фишка самая в чем.
мы вводим произвольный адрес,число и т.д. и программа должна отсортировать лишние символы кроме точки(мы ее не вводим), и буквы, оставляя только числа. а при вводе готового ип адреса автоматически должен проставлять точки между адресами
для этого я и прописал вышеуказанные функции.

p.s. програмка у меня работала некорректно, при вводе адреса 127.0.0.0 писала чти не п. доработал. хороша но не то...
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
15.12.2010, 21:23 #8
А почему программа выдает ошибку: "String is not IP", когда я ввожу например:
192.168.1.1 255.255.255.0
Fleurgen
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 20
15.12.2010, 21:55  [ТС] #9
Код
#include<iostream>
#include<cstdlib>
#include<cstdio>

int main()
{
        char IP[16];
        char* endptr;
        long int a;
        printf("Enter string: ");
        gets(IP);
        if(a=strtol(IP,&endptr,10))
                if(a>=0&&a<=255)
				{
                        int i;
                        for(i=0;i<3;i++)
						{
                                ++endptr;
                                if(!(a=strtol(endptr,&endptr,10))||!(a>=0&&a<=255))
								{
                                        printf("String is not IP");
                                        break;
                                }
                        }
                if(i<3)
                        printf("String is not IP");
                else 
                        printf("String is IP");
                }
                else
                        printf("String is not IP");
        else 
                printf("String is not IP");
		system ("pause");
        return 0;
}
вот так работает
isaak
102 / 39 / 9
Регистрация: 17.10.2010
Сообщений: 658
15.12.2010, 22:05 #10
Спасибо супер все работает как надо!!!
Fleurgen
1 / 1 / 0
Регистрация: 14.12.2010
Сообщений: 20
15.12.2010, 22:12  [ТС] #11
хех. не за что. ))
кто бы мне помог

Добавлено через 1 минуту
Вот еще мой предыдущий код. Но тоже не тот который нужен


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
   int a[15];                           // вводим строки
      char t1, t2, t3;                  // вводим обозначения для точек между строками
      printf("Vvedite predpolagaemii adres: ");
         scanf("%i%c%i%c%i%c%i", &a[0], &t1, &a[1], &t2, &a[2], &t3, &a[3]); //сканируем присваиваемые значения
                 if (a[0]>=0 && a[0]<=255 &&                                 // задаем условие
                     a[1]>=0 && a[1]<=255 &&                                 // для ограничения адреса
                     a[2]>=0 && a[2]<=255 && 
                     a[3]>=0 && a[3]<=255 && 
                     t1 == '.' && 
                     t2 == '.' && 
                     t3 == '.')
                  printf ("DA, ETO IP\n");                              //если условие выполняется то это адрес
            else 
            printf("Net! Eto Nepravda!\n");                             // если нет, то это не адрес
     system ("pause");
   return 0;
}
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
16.12.2010, 09:20 #12
Цитата Сообщение от isaak Посмотреть сообщение
А почему программа выдает ошибку: "String is not IP", когда я ввожу например:
192.168.1.1 255.255.255.0
потому, что этот код просто для примера, чтоб показать как работать с strtol(), там еще много нюансов не учтено.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
16.12.2010, 10:14 #13
C
1
2
3
4
5
6
7
8
9
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
#include <stdio.h>
 
int func(const char *s);
 
int main(void)
{
    const char *sa, *sb;
    
    sa = "127.0.0.1";
    sb = "0.0.0.0";
    
    if (func(sa))
        printf("sa: %s" "\n", sa);
    if (func(sb))
        printf("sb: %s" "\n", sb);
    
    return 0;
}
 
#include <stdlib.h>
#include <ctype.h>
 
int func(const char *s)
{
    char *p;
    int i, n;
    
    for (i = 0; i < 4; i++) {
        if (!isdigit((unsigned char) *s))
            return 0;
        n = strtol(s, &p, 10);
        if (n < 0 || n > 255)
            return 0;
        if (i + 1 < 4 && *p != '.')
            return 0;
        s = p + (i + 1 < 4);
    }
    return *s == '\0';
}
Код
[guest@localhost tests]$ ./t
sa: 127.0.0.1
sb: 0.0.0.0
[guest@localhost tests]$
Добавлено через 4 минуты
там ещё переполнение проверять можно
C
1
2
3
4
5
6
7
8
9
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
#include <stdio.h>
 
int func(const char *s);
 
int main(void)
{
    const char *sa, *sb;
    
    sa = "1111111111111.0.0.1";
    sb = "0.0.0.0";
    
    if (func(sa))
        printf("sa: %s" "\n", sa);
    if (func(sb))
        printf("sb: %s" "\n", sb);
    
    return 0;
}
 
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
 
int func(const char *s)
{
    char *p;
    int i, n;
    
    for (i = 0; i < 4; i++) {
        if (!isdigit((unsigned char) *s))
            return 0;
        n = strtol(s, &p, 10);
#if 1
        printf("%d %d" "\n", n, errno);
        if (errno)
            perror("");
#endif
        if (n < 0 || n > 255)
            return 0;
        if (i + 1 < 4 && *p != '.')
            return 0;
        s = p + (i + 1 < 4);
    }
    return *s == '\0';
}
Код
[guest@localhost tests]$ ./t
2147483647 34
Numerical result out of range
0 34
Numerical result out of range
0 34
Numerical result out of range
0 34
Numerical result out of range
0 34
Numerical result out of range
sb: 0.0.0.0
[guest@localhost tests]$
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2010, 10:14
Привет! Вот еще темы с ответами:

Частный адрес, динамический адрес, статический адрес - какой у меня? - Сети
Привет. Открываем рубрику глупых вопросов. Я сижу с компьютера который подключен к интернету по кабелю, кабель от компьютера идёт к...

На одном из компьютеров адрес dhcp-сервера сменился на адрес компьютера другого сотрудника - Администрирование Windows
Здравствуйте! Столкнулся с такой проблемой: на одном из компьютеров отвалился интернет, перво наперво решил посмотреть какой выдан ip...

Присвоить указателю адрес 6-го элемента массива, напечатать его значение, используя текущий базовый адрес сегмента - Turbo Pascal
Заполнить массив А(10) случайными значениями. Организовать вывод на экран. Присвоить указателю адрес начала размещения массива в памяти....

Если [911A]=51, то переслать поле длины 87(дес) с адреса 777 на адрес 321A иначе на адрес 421A - Assembler
Если =51, то переслать поле длины 87(дес) с адреса 777 на адрес 321A иначе на адрес 421A


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.12.2010, 10:14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru