2013-08-15 5 views
-1

Я новичок в C, и я пытаюсь объединить эти четыре целых числа в одно целое.Объединить четыре целых числа в один

srand(time(NULL)); 
int intOne = 1+rand()%255; 
int intTwo = 1+rand()%255; 
int intThree = 1+rand()%255; 
int intFour = 1+rand()%255; 

int allCombined = ("%i.%i.%i.%i", intOne, intTwo, intThree, intFour); 
printf("%i", allCombined); 

Все, что мне нужно сделать, это объединить эти четыре целых числа в одну переменную в формате IP-адреса.

Пример: 108.41.239.216

Как бы объединить их и сохранить их в переменную для дальнейшего использования?

+0

Использование плюс оператор + :) –

+1

'% i' в' printf' означает «целое число», а не «IP-адрес». Целые числа не имеют точек в их теле. – dasblinkenlight

+3

@GrijeshChauhan Надеюсь, вы шутите, не так ли? Очень смешно :) – dasblinkenlight

ответ

1

Существует много способов сделать это, и никто не прав. Естественным решением, которое пришло ко мне (в контексте вашего фрагмента кода), является сохранение их в массиве целых чисел длиной 4. Затем вы можете отформатировать их соответственно. Например:

int ip_address[ 4 ] = { intOne, intTwo, intThree, intFour }; 

... а потом когда вы хотите использовать его было бы следующим образом:

printf("%d.%d.%d.%d", ip_address[ 0 ], ip_address[ 1 ], ip_address[ 2 ], ip_address[ 3 ]); 

... это также даст вам преимущество, если вы когда-нибудь нужно доступа к частям IP-адреса, вы можете сделать это в O (1).

+0

Спасибо, извините за то, что вы такой C noob. –

+0

@ExpedientHF, все началось с вашей позиции, все в порядке. Я рад, что ответ был способен подтолкнуть вас в правильном направлении - не забудьте сообщить об этом другим, у кого есть тот же вопрос, что и вы, выбрав наиболее подходящий ответ на свой вопрос. –

0

Вот несколько способов, которыми вы могли бы объединить их:

  1. Сохранить все четыре байта без знака 32-разрядного целого числа. Первый байт идет в битах от 0 до 7, второй байт идет в битах с 8 по 15 и т. Д.
  2. Создайте struct, который содержит четыре значения. Тогда вы можете обратиться к ним, как ipAddress.firstOctet, ipAddress.secondOctet и т.д.
  3. Создать массив из четырех байтов: ipAddress[0], ipAddress[1] и т.д.
0

Попробуйте это:

#include <time.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 

int main() 
{ 
    srand(time(NULL)); 
    int intOne = 1 + rand() % 255; 
    int intTwo = 1 + rand() % 255; 
    int intThree = 1 + rand() % 255; 
    int intFour = 1 + rand() % 255; 

    { 
    struct in_addr ia = { 
     (intOne << 0) + (intTwo << 8) + (intThree << 16) + (intFour << 24) /* Here you initialise the integer. */ 
    }; 

    printf("0x%x", ntohl(ai.s_addr)); /* Convert the integer to the correct byte order (endianness) and print it. */ 
    printf("%s\n", inet_ntoa(ia)); /* Here you get the dotted version. */ 
    } 

    return 0; 
} 
Смежные вопросы