恢复所有情况的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段解析出来再校验最后的位数是否一致就可以了。