2014-10-25 2 views
-3

Я использую текстовый файл, в котором два столбца есть Columna начиная диапазон IPaddress и columnB конец диапазона IPaddress, например ,,hexformatted IPAddress диапазон поиска

1002000 1003fff 
1011000 1011fff 
1012000 1013fff 
1021000 1021fff 
1022000 1023fff 
1024000 1027fff 
1030000 103ffff 
1041000 1041fff 
1042000 1043fff 
1044000 1047fff 
1080000 108ffff 

мой searchkey IPAddress предполагают 1021234, так что я хочу реализовать двоичный поиск для этого, я уже сохранил их в массиве, например inbuf [a] и inbuf [a + 1]. Как проверить 4 файла, например abc.txt xyz.txt sww.txt найти ipaddress, попадающий в эти файлы и верните имя файла.

+2

И что вы пробовали? Как это работает? Как это не сработало? –

+0

Спасибо за ответ, я понятия не имею, как это сделать, сэр, меня попросили в интервью, поэтому, пожалуйста, направляйте меня, я изучаю программирование сейчас – chandu

ответ

-1
#include <stdio.h> 
#include <stdlib.h> 

typedef struct range { 
    unsigned start; 
    unsigned end; 
} Range; 

#define MAX_N 256 

Range table[MAX_N]; 

#define range_file "ip_range.txt" 
int load_table(void){ 
    int n = 0; 
    unsigned start, end; 
    FILE *fp = fopen(range_file, "r"); 

    if(!fp){ 
     fprintf(stderr, "%s can't open.", range_file); 
     exit(EXIT_FAILURE); 
    } 
    while(2==fscanf(fp, "%x %x", &start, &end)){ 
     table[n].start = start; 
     table[n++].end = end; 
    } 
    fclose(fp); 
    return n; 
} 

int cmp_range(int no, unsigned key){ 
    if(key < table[no].start) 
     return -1; 
    else if(key > table[no].end) 
     return 1; 
    return 0; 
} 

int search(unsigned key, int low, int high){ 
    while(low <= high){ 
     int mid = (low + high)/2; 
     int status = cmp_range(mid, key); 
     if(status == 0) 
      return mid;//find 
     else if(status < 0) 
      high = mid -1; 
     else 
      low = mid + 1; 
    } 
    return -1;//not find 
} 

int main (void){ 
    int n = load_table(); 
    unsigned key = 0x1021234; 
    int i = search(key, 0, n-1); 

    if(i < 0) 
     printf("%x not found in range table.\n", key); 
    else { 
     printf("%x in ", key); 
     printf("%x-%x\n", table[i].start, table[i].end); 
    } 

    return 0; 
} 
+1

спасибо, сэр, пожалуйста, не возражаете, я не могу понять, могу ли вы сделать это простым сэр или объяснить мне шаги – chandu

+0

@chandu Где вы не понимаете эту часть? – BLUEPIXY

+0

Согласно профилю, у вас уже есть не менее одного года опыта. – BLUEPIXY

Смежные вопросы