Как я могу сохранить вывод цикла for в виде целого числа? - PullRequest
0 голосов
/ 13 марта 2019
for (c = 8; c >= 0; c--){
    k = ip4 >> c;
    if (k & 1)
        printf("1");
    else
        printf("0");
}

Привет всем. Я пытаюсь преобразовать IP-адрес из base10 или base 16 в двоичный файл. Я написал этот код для преобразования IP-адреса в двоичный файл. Но также мне нужно сохранить выходные данные цикла for, чтобы ответить на такой запрос. вопрос и продолжить код. Вопрос по ссылке. Запрещено использование массивов и структур данных. Вот мое задание, которое я пытаюсь решить. Я буду очень рад, если вы решите мою проблему. enter image description here Чем вам за помощь. Вот мой код от начала до цикла. enter image description here Я добавил свой код с самого начала, чтобы вы могли видеть, что такое (ip4). Например, программа спросит пользователя (введите IP-адрес :), а пользователь введет такой IP-адрес (168.122.1.2) в этом IP-адресе (168 равно в ip1) (122 равно ip2) (1 равно ip 3) (2 equan ip4). Итак, у меня есть 4 цикла for для преобразования его в двоичный файл в каждом блоке. Я сохраняю, например (00000001) для ip4. Мне нужно сохранить как целое число.

    #include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main (){

char ch;    
int base,ip1,ip2,ip3,ip4,ip;
int sub1,sub2,sub3,sub4,subnet;
printf("Please enter the Base for your IP Address (10/16):");
scanf("%d",&base);
if(base!=10 && base!=16)
    printf("Sorry that is not a valid base!\n");
if(base==10){
printf("Please enter the IP Address:");
scanf("%d%c%d%c%d%c%d",&ip1,&ch,&ip2,&ch,&ip3,&ch,&ip4);
ip=ip1+ip2+ip3+ip4;
if(ip>0&&ip<1020)
    printf("Thanks it is a valid IP address!\n");
else
    printf("This is NOT a valid IP Address!");  

printf("Please enter the Subnet Mask: ");
scanf("%d%c%d%c%d%c%d",&sub1,&ch,&sub2,&ch,&sub3,&ch,&sub4);
subnet=sub1+sub2+sub3+sub4;
if(subnet>0&&subnet<1020)
printf("Thanks it is a valid Subnet Mask!\n");}

else if(base==16){
printf("Please enter the IP Address:");
scanf("%d%c%d%c%d%c",&ip1,&ch,&ip2,&ch,&ip3,&ch,&ip4);
ip=ip1+ip2+ip3+ip4;
if(ip>0&&ip<1020)
    printf("Thanks it is a valid IP address!\n");
else
    printf("This is NOT a valid IP Address!");  
printf("Please enter the Subnet Mask: ");
scanf("%d%c%d%c%d%c%d",&sub1,&ch,&sub2,&ch,&sub3,&ch,&sub4);
subnet=sub1+sub2+sub3+sub4;
if(subnet>0&&subnet<1020)
printf("Thanks it is a valid Subnet Mask!\n");}         

int menu,k,c;
while(1){
printf("1. Convert IP address to binary\n");
printf("2. Convert subnet mask to binary\n");
printf("3. Specify the class of the IP address\n");
printf("4. Specify the number of host addresses availablen\n");
printf("5. Provide new IP Address and subnet mask\n");
printf("6. Exit\n");
scanf("%d",&menu);
while(menu>0 && menu<6){
    if(menu==1){
        for (c = 8; c >= 0; c--)
  {
    k = ip1 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  }
    printf(".");
  for (c = 8; c >= 0; c--)
  {
    k = ip2 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  }
    printf(".");
    for (c = 8; c >= 0; c--)
  {
    k = ip3 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  } 
    printf(".");
  for (c = 8; c >= 0; c--)
  {
    k = ip4 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");

  }
        printf("\n");
        break;

    }
    else if (menu==2){

    for (c = 8; c >= 0; c--)
  {
    k = sub1 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  }
    printf(".");
  for (c = 8; c >= 0; c--)
  {
    k = sub2 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  }
    printf(".");
    for (c = 8; c >= 0; c--)
  {
    k = sub3 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  } 
    printf(".");
  for (c = 8; c >= 0; c--)
  {
    k = sub4 >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");

  }
        printf("\n");
        break;
}

}
}

    return 0;

}

Вы можете протестировать код. Но вы должны ввести основание 10, и ip будет просто включать точку и целое число муравья, точно так же, как 192.168.1.1, и подсеть должна быть такой.

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Мне нужно сохранить как целое число.

Вам повезло, поскольку вы уже сохранили части своего IP-адреса ip1 ... ip4 как целые числа.

Но мне нужно сохранить двоичный формат, чтобы продолжить.

Возможно, целые числа уже хранятся в простом двоичном представлении, но стандарт C гарантирует, что:

Значения, хранящиеся в… объектах типа unsigned char, должны быть представлены с использованием чисто двоичной записи.

Итак, по крайней мере, после сохранения адресной части в unsigned char, Вы можете безопасно продолжить с шага e. вашего программного задания, не беспокоясь о текстовом представлении адреса. Чтобы определить класс адресов в соответствии с показанной таблицей, достаточно сместить и замаскировать первое число:

        if (menu == 3)
        {
            unsigned char first = ip1;  // convert to "a pure binary notation"
            char class = first>>7 == 0 ? 'A'    // starts with 0
                       : first>>6 == 2 ? 'B'    // starts with 10
                       : first>>5 == 6 ? 'C'    // starts with 110
                       :                 'D';   // the rest
            printf("The class of the given IP address is: %c\n", class);
            break;
        }
0 голосов
/ 13 марта 2019

Вы хотите преобразовать IP-адрес в двоичном виде, но это не то, что вас попросили сделать.

Вопрос, который у вас возник, можно было бы свести к «каковы первые три бита этого»32-битное целое число? "

void start_of_ip(int32_t ip4) {

    /* testing if first bit is not set 
    0x80000000 is 1000 0000 0000 0000 0000 0000 0000 0000 */
    if (!(ip4 & 0x80000000)) {
        /* class A IP*/
        puts("start with b0")
    } else {    
        /* in this block, we know that first bit is set */

        /* testing if second bit is not set */          
        if (!(ip4 & 0x40000000)) {
            /* class B IP*/
            puts("start with b10");
        } else {                
            /* in this block, we know that first two bits are set */

            /* testing if third bit is not set */           
            if (!(ip4 & 0x20000000)) {
                /* class C IP*/
                puts("start with b110");
            } else {
                /* the rest */
                puts("other case");
            }               
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...