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

Разбить ip адрес на составляющие. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
19.09.2011, 12:02     Разбить ip адрес на составляющие. #1
Задача такова получаем на входе строку типа string в которой содержится адрес вида "172.16.11.163" нужно получить четыре масива char по 3 элемента содержащие в себе числа адреса.
например:
string addr="172.16.11.163"; - на входе
// что-то делаем
char addrn[4][3] - на выходе
*addrn[0]=172
*addrn[1]=016
*addrn[2]=011
*addrn[3]=163

Помогите пожалуйста.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
19.09.2011, 12:13     Разбить ip адрес на составляющие. #2
Цитата Сообщение от Driim Посмотреть сообщение
Задача такова получаем на входе строку типа string в которой содержится адрес вида "172.16.11.163" нужно получить четыре масива char по 3 элемента содержащие в себе числа адреса.
C++
1
2
3
4
5
6
char * buf = strtok(sIP,".");
while(buf)
{
      printf("%s\r\n",buf);//Вывод на экран отдельной подстроки IP
      buf = strtok(NULL,".");
}
- Переменную buf в цикле можно загонять в массив или печатать как в моём примере
для использования strtok нужен string.h
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
19.09.2011, 12:23     Разбить ip адрес на составляющие. #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int  main(void) {
   char ip[]   = "172.16.11.163";
   int  arr[4] = { 0, 0, 0, 0 };
 
   // разбивка
   sscanf(ip, "%d.%d.%d.%d", &arr[0], &arr[1], &arr[2], &arr[3]);
 
   for(int i = 0; i < 4; i++)
        printf("%d\n", arr[i]);
   putchar('\n');
 
    // склеивание
   char buf[24];
   sprintf(buf, "%d.%d.%d.%d", arr[0], arr[1], arr[2], arr[3]);
   puts(buf);
 
   getchar();
   return 0;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.09.2011, 12:32     Разбить ip адрес на составляющие. #4
C++
1
2
3
4
5
6
const std::string ip = "127.0.0.1";
std::replace(ip.begin(), ip.end(), '.',  ' ');
char arr[4][3];
std::istringstream ss(ip);
ss >> arr[0] >> arr[1] >> arr[2] >> arr[3];
std::cout << arr[0] << arr[1] << arr[2] << arr[3];
Добавлено через 4 минуты
Или.

C++
1
2
3
4
std::vector<std::string> vec;
const std::string ip = "127.0.0.1";
boost::split(vec, ip, boost::is_any_of("."), boost::token_compress_on);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
19.09.2011, 12:39     Разбить ip адрес на составляющие. #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <boost/spirit/core.hpp> 
#include <boost/spirit/actor/push_back_actor.hpp> 
#include <iostream>
#include <vector>
#include<algorithm>
#include<iterator>
 
 
using namespace boost::spirit; 
 
bool parse_numbers(const char* str, std::vector<int>& v){
    return parse(str, ( int_p[push_back_a(v)] >> *('.' >> int_p[push_back_a(v)]) ), space_p).full; 
}
 
int main(){
    std::vector<int> vec;
    if(parse_numbers("172.16.11.163", vec))
        std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout,"\n"));
    return 0;
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.09.2011, 12:42     Разбить ip адрес на составляющие. #6
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
#include <iostream>
 
int main()
{
    char ip[] = "172.16.11.163";
    
    char result[5][4] = { };
    
    for (int i = 0, k = 0, j = 0 ; ip[i] ; ++i)
    {
        if ( ip[i] != '.' )
        {
            result[k][j++] = ip[i];
        }
        else
        {
            ++k;
            j = 0;
        }
    }
    
    for (int i = 0 ; result[i][0] ; ++i)
    {
        for (int j = 0; result[i][j] ; ++j)
            std::cout << result[i][j];
        std::cout << std::endl;
    }
 
}
ForEveR
19.09.2011, 12:56
  #7

Не по теме:

Kastaneda, Да ты извращенец парсить ip-шники спиритом)

Kastaneda
19.09.2011, 12:59
  #8

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
Kastaneda, Да ты извращенец парсить ip-шники спиритом)
Да не, просто я начал акуратно подкрадываться к boost'у, вчера читал статью, там был похожий пример. Я его только слегка подкоректировал, а на самом деле я не на столько boost знаю Но пример действительно извращенный. По-моему самый адекватный вариант для ТС'а во втором посте)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2011, 13:09     Разбить ip адрес на составляющие.
Еще ссылки по теме:

C++ Адрес объекта, адрес указателя. Где что находится?
C++ Приложение позволяет изменять цвет прямоугольника, увеличивая или уменьшая составляющие цвета.почему неработает программа?
Получить отдельно цифры, составляющие число C++

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

Или воспользуйтесь поиском по форуму:
Driim
7 / 7 / 0
Регистрация: 29.03.2011
Сообщений: 81
19.09.2011, 13:09  [ТС]     Разбить ip адрес на составляющие. #9
Wow, как много вариантов и так оперативно =) Но (вот почему всегда так), char addrn[4][3] не просто так тут каждое число должно хранится в отдельном char, а если чисел меньше 3 то должны быть нули т.е.
addrn[0][0]=1
addrn[0][1]=7
...
addrn[1][0]=0
addrn[1][1]=1
addrn[1][2]=6 и т.д.


Хотя я с выводами поторопился, решение xAtom подойдет только чуточку format в sscanf изменить
C++
1
sscanf(ip, "%d.%d.%d.%d", &arr[0], &arr[1], &arr[2], &arr[3]);
на
C++
1
sscanf(ip, "%03d.%03d.%03d.%03d", &arr[0], &arr[1], &arr[2], &arr[3]);
Всем спасибо.
Yandex
Объявления
19.09.2011, 13:09     Разбить ip адрес на составляющие.
Ответ Создать тему
Опции темы

Текущее время: 13:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru