Advertisement
LA77

Untitled

Feb 27th, 2025
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5.  
  6. #define MINUS_INFINITY -10000
  7. #define STRING_LENGTH 50
  8. #define OCTET 8
  9.  
  10. // Getting the maximum of two numbers
  11. int max(int num1, int num2)
  12. {
  13.     return (num1 > num2) ? num1 : num2;
  14. }
  15.  
  16. /// Getting a number that exists after a certain character
  17. int get_number(char *text, char delimiter)
  18. {
  19.     int text_length = strlen(text);
  20.     int number_value = 0;
  21.     int number_start_index = -1;
  22.     for(int i = 0; i < text_length; ++i)
  23.     {
  24.         if(text[i] == delimiter)
  25.         {
  26.             number_start_index = i + 1;
  27.             break;
  28.         }
  29.     }
  30.  
  31.     for(int i = number_start_index; i < text_length - 1 && text[i] >= '0' && text[i] <= '9'; ++i)
  32.     {
  33.         number_value = number_value * 10 + (text[i] - '0');
  34.     }    
  35.     return number_value;
  36. }
  37.  
  38. /// Trying to see if the first n-bits of ip_address are similar to those of network_address
  39. int matches_network(char *ip_address, char *network_address, int prefix_length)
  40. {
  41.     int ip_index = 0, network_index = 0;
  42.     while(true)
  43.     {
  44.         int ip_octet = 0;
  45.         while(ip_address[ip_index] >= '0' && ip_address[ip_index] <= '9')
  46.         {
  47.             ip_octet = ip_octet * 10 + ip_address[ip_index] - '0';
  48.             ip_index++;
  49.         }
  50.  
  51.         int network_octet = 0;
  52.         while(network_address[network_index] >= '0' && network_address[network_index] <= '9')
  53.         {
  54.             network_octet = network_octet * 10 + network_address[network_index] - '0';
  55.             network_index++;
  56.         }
  57.  
  58.         int bit_counter = OCTET;
  59.         while(bit_counter)
  60.         {
  61.             if(network_octet % 2 != ip_octet % 2)
  62.             {
  63.                 return 0;
  64.             }
  65.             prefix_length--;
  66.             if(prefix_length == 0)
  67.                 return 1;
  68.             ip_octet >>= 1;
  69.             network_octet >>= 1;
  70.             bit_counter--;
  71.         }
  72.  
  73.         if(network_address[network_index] == '/') break;
  74.         ip_index++;
  75.         network_index++;
  76.     }
  77.     return 1;
  78. }
  79.  
  80. // Locating the default IP 0.0.0.0 /0 if it exists
  81. int find_default_route(char **routing_entries, int num_routing_entries)
  82. {
  83.     for(int i = 0; i < num_routing_entries; ++i)
  84.     {
  85.         int is_default = true;
  86.         for(int j = 0; j < strlen(routing_entries[i]); ++j)
  87.         {
  88.             if(routing_entries[i][j] == '/')
  89.             {
  90.                 break;
  91.             }
  92.             if(routing_entries[i][j] != '0' && routing_entries[i][j] != '.')
  93.             {
  94.                 is_default = false;
  95.                 break;
  96.             }
  97.         }
  98.         if(is_default) return get_number(routing_entries[i], ' ');
  99.     }
  100.     return -1;
  101. }
  102.  
  103.  
  104. int main()
  105. {
  106.     // Reading the first addresses
  107.     int num_routing_entries;
  108.     scanf("%d", &num_routing_entries);
  109.     getchar();
  110.     char **routing_entries = malloc(sizeof(char *) * (num_routing_entries + 1));
  111.     for(int i = 0; i < num_routing_entries; ++i)
  112.     {
  113.         routing_entries[i] = malloc(sizeof(char) * (STRING_LENGTH));
  114.     }
  115.  
  116.     for(int i = 0; i < num_routing_entries; ++i)
  117.     {
  118.         fgets(routing_entries[i], STRING_LENGTH, stdin);
  119.     }
  120.  
  121.     int default_route = find_default_route(routing_entries, num_routing_entries);
  122.    
  123.     // Reading the second addresses
  124.     int num_ips;
  125.     scanf("%d", &num_ips);
  126.     getchar();
  127.     char **ip_addresses = malloc(sizeof(char *) * (num_ips + 1));
  128.     for(int i = 0; i < num_ips; ++i)
  129.     {
  130.         ip_addresses[i] = malloc(sizeof(char) * (STRING_LENGTH));
  131.     }
  132.     for(int i = 0; i < num_ips; ++i)
  133.     {
  134.         fgets(ip_addresses[i], STRING_LENGTH, stdin);
  135.     }
  136.  
  137.  
  138.     // Solving the problem
  139.     for(int i = 0; i < num_ips; ++i)
  140.     {
  141.         int max_prefix_length = MINUS_INFINITY, best_route_id = -1;
  142.         for(int j = 0; j < num_routing_entries; ++j)
  143.         {
  144.             int entry_prefix = get_number(routing_entries[j], '/');
  145.  
  146.             if(matches_network(ip_addresses[i], routing_entries[j], entry_prefix))
  147.             {
  148.                 if(entry_prefix > max_prefix_length)
  149.                 {
  150.                     max_prefix_length = entry_prefix;
  151.                     best_route_id = get_number(routing_entries[j], ' ');
  152.                 }
  153.             }
  154.         }
  155.         if(best_route_id == -1 && default_route != -1)
  156.         {
  157.             best_route_id = default_route;
  158.         }
  159.         printf("%d\n", best_route_id);
  160.     }
  161.  
  162.     // Freeing memory
  163.     for(int i = 0; i < num_routing_entries; ++i)
  164.     {
  165.         free(routing_entries[i]);
  166.     }
  167.     free(routing_entries);
  168.  
  169.     for(int i = 0; i < num_ips; ++i)
  170.     {
  171.         free(ip_addresses[i]);
  172.     }
  173.     free(ip_addresses);
  174.  
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement