一道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
怎么写一个通用的方法?
...全文
266 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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);
}

33,321

社区成员

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

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