一道ip地址的计算题

rophie 2013-04-24 08:50:00
比如 用户在程序界面上填写 192.168.1.* 这样 就输出从 192.168.1.1 到192.168.1.255
用户在程序界面上填写 192.*.1.* 这样 就输出从 192.1.1.1 到192.255.1.255
怎么写一个通用的方法?
...全文
253 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2013-04-24
  • 打赏
  • 举报
回复
最多4重循环。
rophie 2013-04-24
  • 打赏
  • 举报
回复
引用 2 楼 youyou1912 的回复:
C/C++ code?123456789101112131415161718192021222324252627282930struct{ unsigned char a; bool mask_a; // true = * unsigned char b; bool mask_b; unsigned char c; bool mask_ c; char d;……
多谢!可以用,纠正个错误:for (int j =(x.mask_b ? 1: x.b); i<=(x.mask_b ? 255 : x.b); ++j)这里的写成i改成j,肯定是眼花写错了
rophie 2013-04-24
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
最多四层0~255的for循环就可以了啊。
192.168.1.1中哪些是*是不定的
图灵狗 2013-04-24
  • 打赏
  • 举报
回复
最多四层0~255的for循环就可以了啊。
youyou1912 2013-04-24
  • 打赏
  • 举报
回复
struct
{
  unsigned char a;
  bool mask_a; // true = *
  unsigned char b;
  bool mask_b;
  unsigned char c;
  bool mask_ c;
  char d;
  unsigned bool mask_d;
} IP;

IP x = {192, false, '*', true, 1, false, '*', true};

Init(x); // init x here

// 可以把遍历遍历放for外面, 效率高点.
for (int i =(x.mask_a ? 1: x.a); i<=(x.mask_a ? 255 : x.a); ++i)
{
  for (int j  =(x.mask_b ? 1: x.b); i<=(x.mask_b ? 255 : x.b); ++j)
  {
    for (int k= (x.mask_c ? 1: x.c); k<=(x.mask_c ? 255 : x.c); ++k)
    {
      for (int m= (x.mask_d ? 1: x.d); m<=(x.mask_d ? 255 : x.d); ++m)
      {
         cout << i << "." << j << "." << k << "." << m << endl;
      }
    }
  }
}
youxin2012 2013-04-24
  • 打赏
  • 举报
回复
你这是在哪 输入ip地址? MFC中的ip地址栏控件里 只允许 输入数字。 另外,你输出 从 192.168.1.1 到192.168.1.255的一个地址,还是所有地址?
赵4老师 2013-04-24
  • 打赏
  • 举报
回复
仅供参考
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
FILE *f;
int i,n,line,st;
int n1,n2,n3;
int b1,b2,b3;
int e1,e2,e3;
int w1,w2,w3;
int v1,v2,v3;
char ln[256];
char fmt[256];
char fmd[6];
char tmp[256];
char *s1,*s2,*s3,*s4;
char L,R,D;
void main(int argc,char *argv[]) {
    if (argc<2) {
    PMT:
        printf("%s filename.ext [ParenthesesChar] [DelimiterChar]\nParenthesesChar is '(' default or '[' or '{'\nDelimiterChar is ',' default",argv[0]);
        return;
    }
    if (argc==2) {
        L='(';R=')';D=',';
    } else {
        switch (argv[2][0]) {
            case '(':L='(';R=')';break;
            case '[':L='[';R=']';break;
            case '{':L='{';R='}';break;
            default:goto PMT;
        }
        D=',';
        if (argc>=4) D=argv[3][0];
    }
    sprintf(fmd,"%%d%c%%d",D);
    if ((f=fopen(argv[1],"rt"))==NULL) {
        printf("Can not open %s",argv[1]);
        return;
    }
    line=0;
    while (1) {
        fgets(ln,255,f);
        if (feof(f)) break;//
        line++;
        n=0;st=0;
        for (i=0;i<(int)strlen(ln);i++) {
            switch (st) {
            case 0:if (ln[i]==L) st=1;break;
            case 1:if (ln[i]==D) st=2;break;
            case 2:if (ln[i]==R) {st=0;n++;} break;
            }
        }
        switch (n) {
            case 0:
                printf("%s",ln);
            break;
            case 1:
                s1=strchr(ln,L);
                s2=strchr(s1,R);
                if (s2==NULL) {
                    cprintf("\a\a\a missing %c in line %d",R,line);
                    fclose(f);
                    return;
                }
                s1[0]=0;
                s1++;
                s2++;
                v1=sscanf(s1,fmd,&b1,&e1);
                if (v1==2) {
                    w1=1+(int)log10((double)e1);
                    sprintf(fmt,"%%s%%0%1dd%%s",w1);
                    for (n1=b1;n1<=e1;n1++) {
                        printf(fmt,ln,n1,s2);
                    }
                } else if (s1[1]==D) {
                    b1=s1[0];
                    e1=s1[2];
                    for (n1=b1;n1<=e1;n1++) {
                        printf("%s%c%s",ln,n1,s2);
                    }
                } else {
                    printf("%s",ln);
                }
            break;
            case 2:
                s1=strchr(ln,L);
                s2=strchr(s1,R);
                if (s2==NULL) {
                    cprintf("\a\a\a missing %c in line %d",R,line);
                    fclose(f);
                    return;
                }
                s1[0]=0;
                s1++;
                s2++;
                v1=sscanf(s1,fmd,&b1,&e1);
                if (v1==2) {
                    w1=1+(int)log10((double)e1);
                } else {
                    b1=s1[0];
                    e1=s1[2];
                }

                s1=strchr(s2,L);
                s3=strchr(s1,R);
                if (s3==NULL) {
                    cprintf("\a\a\a missing %c in line %d",R,line);
                    fclose(f);
                    return;
                }
                s1[0]=0;
                s1++;
                s3++;
                v2=sscanf(s1,fmd,&b2,&e2);
                if (v2==2) {
                    w2=1+(int)log10((double)e2);
                } else {
                    b2=s1[0];
                    e2=s1[2];
                }

                strcpy(fmt,"%s");
                if (v1==2) sprintf(tmp,"%%0%1dd",w1);
                else strcpy(tmp,"%c");
                strcat(fmt,tmp);
                strcat(fmt,"%s");
                if (v2==2) sprintf(tmp,"%%0%1dd",w2);
                else strcpy(tmp,"%c");
                strcat(fmt,tmp);
                strcat(fmt,"%s");
                for (n1=b1;n1<=e1;n1++) {
                    for (n2=b2;n2<=e2;n2++) {
                        printf(fmt,ln,n1,s2,n2,s3);
                    }
                }
            break;
            case 3:
                s1=strchr(ln,L);
                s2=strchr(s1,R);
                if (s2==NULL) {
                    cprintf("\a\a\a missing %c in line %d",R,line);
                    fclose(f);
                    return;
                }
                s1[0]=0;
                s1++;
                s2++;
                v1=sscanf(s1,fmd,&b1,&e1);
                if (v1==2) {
                    w1=1+(int)log10((double)e1);
                } else {
                    b1=s1[0];
                    e1=s1[2];
                }

                s1=strchr(s2,L);
                s3=strchr(s1,R);
                if (s3==NULL) {
                    cprintf("\a\a\a missing %c in line %d",R,line);
                    fclose(f);
                    return;
                }
                s1[0]=0;
                s1++;
                s3++;
                v2=sscanf(s1,fmd,&b2,&e2);
                if (v2==2) {
                    w2=1+(int)log10((double)e2);
                } else {
                    b2=s1[0];
                    e2=s1[2];
                }

                s1=strchr(s3,L);
                s4=strchr(s1,R);
                if (s4==NULL) {
                    cprintf("\a\a\a missing %c in line %d",R,line);
                    fclose(f);
                    return;
                }
                s1[0]=0;
                s1++;
                s4++;
                v3=sscanf(s1,fmd,&b3,&e3);
                if (v3==2) {
                    w3=1+(int)log10((double)e3);
                } else {
                    b3=s1[0];
                    e3=s1[2];
                }

                sprintf(fmt,"%%s%%0%1dd%%s%%0%1dd%%s%%0%1dd%%s",w1,w2,w3);
                strcpy(fmt,"%s");
                if (v1==2) sprintf(tmp,"%%0%1dd",w1);
                else strcpy(tmp,"%c");
                strcat(fmt,tmp);
                strcat(fmt,"%s");
                if (v2==2) sprintf(tmp,"%%0%1dd",w2);
                else strcpy(tmp,"%c");
                strcat(fmt,tmp);
                strcat(fmt,"%s");
                if (v3==2) sprintf(tmp,"%%0%1dd",w3);
                else strcpy(tmp,"%c");
                strcat(fmt,tmp);
                strcat(fmt,"%s");

                for (n1=b1;n1<=e1;n1++) {
                    for (n2=b2;n2<=e2;n2++) {
                        for (n3=b3;n3<=e3;n3++) {
                            printf(fmt,ln,n1,s2,n2,s3,n3,s4);
                        }

                    }
                }
            break;
            default:
                cprintf("\a\a\a > 3 repeat in line %d",line);
                fclose(f);
                return;
        }
    }
    fclose(f);
}
三级网络技术考过指南 前言(必读) 1.基础准备 1.1 题库 1.2 二进制转换 1.3 基础概念 1.4 备考建议 2.选择题(40 道 40 分) 2.1 第一类选择题 2.1.1 问传输速度 2.1.2 求交换机带宽 2.1.3 系统可用性与停机时间 2.1.4 写地址块的子网掩码 2.1.5 网络地址转换 NAT 2.1.6 IP 地址块聚合 2.1.7 路由表距离更新 2.1.8 IPv6 地址简化表示 2.1.9 数据包 2.1.10 三种备份 2.2 第二类选择题 2.3 第三类选择题 2.3.1 弹性分组环 RPR 2.3.2 无线接入技术 2.3.3 城域网 QoS 2.3.4 接入技术特征 2.3.5 服务器技术 2.3.6 综合布线 2.3.7 BGP 协议 2.3.8 RIP 协议 2.3.9 OSPF 协议 2.3.10 集线器 2.3.11 交换机 2.3.12 路由器 2.3.13 IEEE 802.11 2.3.14 蓝牙 2.3.15 Serv-U FTP 服务器 2.3.16 DNS 服务器 2.3.17 DHCP 服务器 2.3.18 WWW 服务器 2.3.19 Wmail 邮件服务器 2.3.20 PIX 防火墙 2.3.21 可信计算机评估准则 2.3.22 入侵防护系统 2.3.23 网络攻击 2.3.24 无线局域网设备 2.3.25 VLAN 2.3.26 Cisco 路由器上的存储器 2.3.27 防火墙对应端口的连接方案 2.3.28 STP 生成树结构 2.3.29 Catelyst 配置命令 2.3.30 其他 3.大题(前四道每道10分,最后一道20分) 3.1 第一道 填地址表 3.2 第二道 配置路由器 3.3 第三道 DHCP 报文 3.4 第四道 sniffer 数据包 3.5 最后一道 3.5.1 填表部分(12分) 3.5.2 中间部分(2~4分) 3.5.3 计算子网掩码和 IP 段部分(4~6分)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧