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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.88
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
#1

Калькулятор IP - C++

05.10.2009, 20:21. Просмотров 4394. Ответов 30
Метки нет (Все метки)

Нужно написать программку, которая обрабатывает значения ip и маски, и выводит информацию (число сетей, узлов и т.д.). В связи с небольшим опытом программирования, не знаю как интерпретировать ip на языке, не знаю как записать и где сохранить. Какие могут быть варианты, с учетом более удобной дальнейшей работы с адресом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2009, 20:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Калькулятор IP (C++):

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

Калькулятор - C++
Доброго времени суток, Народ! Помогите плиз с задачей. Нужен исходник калькулятора, самого простого, на 4 действия. Заранее спасибо!!!

Калькулятор на С++ - C++
Сделал калькулятор, работает нормально, но программа считает только два числа за раз: >>Картинка<< , как сделать так чтоб пользователь...

Калькулятор на C++ - C++
Приветствую всех. Ребят нужна помощь, в с++ особо то не рублю, веб-разработкой занимаюсь, а дали задание. Может у кого есть подобное "чудо"...

Калькулятор - C++
Пишу калькулятор. Прошу помощи. Вот мой код #include <iostream> #include <locale.h> #include <string.h> #include <cmath> using...

Калькулятор - C++
Помогите пожалуйста сделать в этом калькуляторе скобки. #include <iostream> #include <stdlib.h> #include <string.h> #include...

30
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 16:39  [ТС] #16
Цитата Сообщение от odip Посмотреть сообщение
Выделить и пропарсить 4 числа.
Например можно использовать функцию strtol().
long int strtol ( const char * str, char ** endptr, int base );
Это прототип функции. Т.е. как я понял, получает функция три параметра
str - указатель на нашу стркоу
endptr - указатель на символ, который считается концом строки ? Почему ти идет как указатель на указатель на char ?
base - параметр, определяющий систему исчисления ?

Что не так понял ?

Добавлено через 56 секунд
Цитата Сообщение от odip Посмотреть сообщение
Используй inet_ntoa(), inet_aton()
Я просто разобраться хочу в работе функций
0
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
12.10.2009, 16:57 #17
2Lorr: У тебя какой компилятор ?
Открой описание функции и почитай что делает.
0
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 17:28  [ТС] #18
Цитата Сообщение от odip Посмотреть сообщение
2Lorr: У тебя какой компилятор ?
Открой описание функции и почитай что делает.
Dev и VS8 без help'a

Нашел описание, как работает в общих чертах понял (strtol);
В описании пример был, не понял один момент.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
  char * pEnd;
  long int li1, li2, li3, li4;
  li1 = strtol (szNumbers,&pEnd,10);
  li2 = strtol (pEnd,&pEnd,16);
  li3 = strtol (pEnd,&pEnd,2);
  li4 = strtol (pEnd,NULL,0);
  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);
  return 0;
}
При запуске программы, создается строка и указатель на char и четыре переменных, которым будут присвоены результаты работы функции strtol.
Встроке
li1 = strtol (szNumbers,&pEnd,10); функции передается строка символов, которую необходимо интерпретировать в число, указатель, по адресу в котором запишется символ, на котором остановлено преобразование строки, и идентификатор системы исчисления.
li2 = strtol (pEnd,&pEnd,16); но почему в этой строке в качестве строки с символами, которые нужно интерпретировать в число, передается по сути символ, на котором было остановлено преобразование в первый вызов функции ?
0
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
12.10.2009, 18:27 #19
http://opennet.ru/man.shtml?topic=st...ry=3&russian=0
http://www.codenet.ru/progr/cpp/sprd/strtod_strtoul.php

Ты неправильно делаешь !!!
Правильно как у меня:
C
1
2
3
4
d1= strtol( ptr, &endptr, 10 );
ptr= endptr;
ptr++;
d2= strtol( ptr, &endptr, 10 );
Добавлено через 41 секунду
А вообще быстрее может быть inet_aton() использовать.
Или вообще написать свой парсер без strtol()

Добавлено через 8 минут
Dev и VS8 без help'a
К Visual Studio 2008 скачай MSDN help.

В Internet полно документации.

А как ты программы пишешь, если ни одной функции не знаешь ?
0
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
12.10.2009, 19:57  [ТС] #20
Цитата Сообщение от odip Посмотреть сообщение

А как ты программы пишешь, если ни одной функции не знаешь ?
Плохо пишу =(

Добавлено через 27 минут
Цитата Сообщение от odip Посмотреть сообщение
http://opennet.ru/man.shtml?topic=strtol&category=3&russian=0
http://www.codenet.ru/progr/cpp/sprd/strtod_strtoul.php

Ты неправильно делаешь !!!
Правильно как у меня:
C
1
2
3
4
d1= strtol( ptr, &endptr, 10 );
ptr= endptr;
ptr++;
d2= strtol( ptr, &endptr, 10 );
Сори за настырность, но объясните почему приведенный мой вариант из описания не верный...
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2009, 03:38 #21
Цитата Сообщение от Lorr
что делает? Объявляет указатель на тип char. Но резервируется же область памяти 1 бай, как можно инициализировать строкой "127.0.0.1" ? Или я что то недопонял?
указатель на тип char - это переменная, которая хранит адрес переменной типа char, вообще, она хранит адрес объекта, поэтому, когда здесь переменной нет, есть строка в статической области памяти с которой можно прочитать

функция sscanf читает с этой строки адрес по кусочкам
и они сохранены в виде простых чисел в a, b, c, d

вывести их можно
C
1
    printf("%d.%d.%d.%d" "\n", a, b, c, d);
0
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
13.10.2009, 08:52 #22
почему приведенный мой вариант из описания не верный
Потому что endptr указывает на символ '.'
И нужно его сдвинуть вправо на один, чтобы strtol() работал.

Добавлено через 53 секунды
вывести их можно
Ему нужно преобразовать эти 4 октета в одно число типа long или unsigned long, чтобы можно было с ним работать.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
13.10.2009, 13:22 #23
да это через маску делается

C
1
2
3
4
5
6
7
    unsigned long addr;
 
    addr = 0;
    addr |= a << 3*8;
    addr |= b << 2*8;
    addr |= c << 8;
    addr |= d;
0
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
13.10.2009, 14:40  [ТС] #24
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
46
47
48
49
#include <iostream>
#include <cstdlib>
#include <stdlib.h>
 
 
using namespace std;
 
    
int main()
{
   char stringIP[16];  //Строка с ИП
   char stringM[16]; //Строка с маской
   cout << "Enter IP: "; cin >> stringIP;
   cout << "Enter Mask: "; cin >> stringM;
   char *str, *pEnd;
   
   int akIP[4], //массив, каждый элемент которого есть октет ИП
   akM[4],  //тоже самое с масокой
   akAS[4];  //для записи адреса сети
   
   //Здесь преобразуем ИП в число и записываем в массив
   akIP[0]=strtol(stringIP, &pEnd, 10);
   str = pEnd; str++;
   akIP[1]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akIP[2]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akIP[3]=strtol(str, &pEnd, 10);
   
   //здесь делаем тоже самое с маской
   akM[0]=strtol(stringM, &pEnd, 10);
   str = pEnd; str++;
   akM[1]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akM[2]=strtol(str, &pEnd, 10);
   str=pEnd; str++;
   akM[3]=strtol(str, &pEnd, 10);
   
   //Здесь определяем сетевой адрес и выводим его...
   cout << endl << "Network address: " ;
   for(int i=0; i<4; i++) {
   akAS[i]=akIP[i] & akM[i];
   cout << akAS[i]; if(i==3)break; cout << ".";
} cout << endl;
 
  
    system("pause");
    return 0;
}
Вот что получислось.
Для хранения адресов выбрал массивы из 4-х элементов. Но что-то тяжело так работать.
Не знаю как определять теперь широковещательный адрес...
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2009, 01:35 #25
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
main()
{
    unsigned long n;
    int a, b, c, d;    
        
    a = 127;
    b = 0;
    c = 0;
    d = 1;
        
    n = 0;    
    n |= a << 3*8;    
    n |= b << 2*8;
    n |= c << 1*8;
    n |= d << 0*8;
        
    printf("%lx" "\n", n);    
        
    return 0;
}
0
Lorr
0 / 0 / 0
Регистрация: 21.04.2009
Сообщений: 21
14.10.2009, 03:18  [ТС] #26
accept, объясни пожалуйста что происходит в строках 15-21 ?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2009, 07:06 #27
C
1
2
3
4
5
    int a = 3;
 
    a |= 4;
 
    printf("%d" "\n", a);
выведет 7

a:
00000000 00000000 00000000 00000011

4:
00000000 00000000 00000000 00000100

a |= 4:
00000000 00000000 00000000 00000111

<< - сдвигает влево, дополняя нулями, пока нет переполнения это эквивалентно умножению на два

ты пододвигаешь нужное число на место, где оно должно быть, а потом применяешь операцию побитового "сложения", таким образом октеты занимают свои места в четырёх байтах переменной типа unsigned long
0
odip
Эксперт С++
7157 / 3219 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
14.10.2009, 12:55 #28
Можно сразу.
C
1
n= (a<<24) | (b<<16) | (c<<8) | d;
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
14.10.2009, 14:15 #29
вообще, там для цикла всё завёрнуто, чтобы можно было сделать octets[4] вместо a b c d
0
kirs2
0 / 0 / 0
Регистрация: 05.01.2014
Сообщений: 10
05.01.2014, 13:33 #30
можешь весь код кинуть плз)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2014, 13:33
Привет! Вот еще темы с ответами:

Калькулятор - C++
Решил написать калькулятор, а вот и он: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR 'a' ...

Калькулятор - C++
Вот сам калькулятор: #include&lt;conio.h&gt; #include&lt;locale.h&gt; #include&lt;stdio.h&gt; #define END '0' #define ERROR -1 #include&lt;stdlib.h&gt;...

Калькулятор - C++
Написал примитивный калькулятор: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;conio.h&gt; using namespace std; int...

Калькулятор - C++
Есть такое условие: If(b=='+') s=a+b; как сделать так чтобы я мог додавать не два числа а a+b+...+n


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

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

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