恢复所有情况的ip地址

在终端下输入一串ip字符串如:19219219211,ip地址可能是19.219.219.211、192.19.219.211、192.192.19.211和192.192.192.11。

以下是本人造的轮子,代码看起来比较粗糙。

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 /**
 5  * 检测地址段是否合法
 6  * @param  i    个十百位情况,所以情况是0、1和2
 7  * @param  addr IP段字符串
 8  * @param  buf  输入的IP字符串
 9  * @return      成功返回0,失败返回1
10  */
11 int check_addr(int i, int *addr, char *buf)
12 {
13     char temp[4];
14     memcpy(temp, buf, i + 1);
15     temp[i + 1] = 0;
16     if ((addr[i] =  atoi(temp)) > 255)
17         return 1;
18     return 0;
19 }
20 
21 int main(int argc, char const **argv)
22 {
23     int addr0[3], addr1[3], addr2[3], addr3[3];    //个十百位三种情况
24     char buf[100];
25     int len;
26     int i, j, k, l;
27 start:
28     while (fgets(buf, 100, stdin) != NULL) {
29         if (buf[strlen(buf) - 1]  = '\n')
30             buf[strlen(buf) - 1] = 0;
31         len = strlen(buf);
32         if (len < 4  || len > 12) {
33             printf("please intput 0~9 num 4 to 12 times\n");
34             goto start;
35         }
36         for (i = 0; i < len; ++i) {
37             if (buf[i] < '0' | buf[i] > '9') {
38                 printf("please intput 0~9 num 4 to 12 times\n");
39                 goto start;
40             }
41         }
42         //循环不算多,直接嵌套不使用递归。
43         for (i = 0; i < 3; ++i) {
44             if (check_addr(i, addr0, buf) != 0)
45                 continue;
46             for (j = 0; j < 3; ++j) {
47                 if (check_addr(j, addr1, buf + i + 1) != 0)
48                     continue;
49                 for (k = 0; k < 3; ++k) {
50                     if (check_addr(k, addr2, buf + i + j +2) != 0)
51                         continue;
52                     for (l = 0; l < 3; ++l) {
53                         if (check_addr(l, addr3, buf + i + j + k+ 3) != 0)
54                             continue;
55                         if (len != i + j + k + l + 4)    //总位数不符合不输出
56                             continue;
57                         printf("ip address may be: %d.%d.%d.%d\n", \
58                                addr0[i], addr1[j], addr2[k], addr3[l]);
59                     }
60                 }
61             }
62 
63         }
64     }
65     return 0;
66 }

因为每个ip段都只有3种情况:个十百。只要把四段ip段解析出来再校验最后的位数是否一致就可以了。

 

posted @ 2016-08-23 02:46  Kevin_Hwang  阅读(287)  评论(0编辑  收藏  举报