码迷,mamicode.com
首页 > 其他好文 > 详细

恢复所有情况的ip地址

时间:2016-08-23 06:53:35      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

在终端下输入一串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段解析出来再校验最后的位数是否一致就可以了。

 

恢复所有情况的ip地址

标签:

原文地址:http://www.cnblogs.com/kevinhwang/p/5797836.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!