为了账号安全,请及时绑定邮箱和手机立即绑定

照着书上打的“IP地址的合法性及子网判断”为什么显示错误运行不了。。。求大神

照着书上打的“IP地址的合法性及子网判断”为什么显示错误运行不了。。。求大神

C C++
永远的魔兽玩家 2016-04-12 23:01:03
#include<iostream.h>#include<string.h>#include<stdlib.h>#include<ctype.h>//定义IP地址类class ipTest{ char ip[15]; char subnetPlusMask[18]; char subnet[18]; char TempIp[15]; char TempSub[18]; int makk; bool maskIsValid;public: ipTest(char*,char*); ~ipTest(){}; bool NoIlleagalChar(char*); bool ipIsValid(char*); bool subnetIsValid(char*); void belong(); void print();};void main(int argc,char*argv[]){ if(argc!=3) { cout<<"please input command:ip_test subnet/mask ip"; return; } else { if(strlen(argv[1])>18) { cout<<"Subnet/mask is too long!"; return; } if(strlen(argv[2])>15) {            cout<<"Ip Address is too long!"; return; } ipTest test(argv[1],argv[2]); test.print(); }}//ip地址类构造函数ipTest::ipTest(char* subnetPlusMask,char *ip){ maskIsValid=true; char temp[2]; //将'/'前的字符复制到subnet中 int smLen=strlen(subnetPlusMask); for(int i=0;i<smLen&&subnetPlusMask[i]!='/';i++) { this->subnet[i]=subnetPlusMask[i]; this->TempSub[i]=subnetPlusMask[i]; } subnet[i]='/0'; TempSub[i]='/0'; //初始化mask和maskIsValid if(i<=smLen-2) { if(i==smLen-2) { temp[0]=subnetPlusMask[i+1]; if(!isdigit(temp[0])) maskIsValid=false; } else { if(i==smLen-3) { temp[0]=subnetPlusMask[i+1]; temp[1]=subnetPlusMask[i+2]; if(!(isdigit(temp[0])&&isdigit(temp[1]))) maskIsValid=false; } } mask=atoi(temp); if(mask<0||mask>32) maskIsValid=false; } else maskIsValid=false; //为subnetPlusMask与ip赋值 strcpy(this->subnetPlusMask,subnetPlusMask)    strcpy(this->ip,ip); strcpy(this->TempIp,ip);}//调用判别函数并输出结果void ipTest::print(){ bool subIsV=subnetIsValid(TempSub); bool ipIsV=ipIsValid(TempIP); //判断子网是否合法 if(!subIsV) cout<<"subnet is invalid!"<<end1; else cout<<"Valid subnet:"<<subnet<<end1; //判断掩码是否合法 if(!maskIsValid) cout<<"Mask is invalid!"<<end1; else cout<<"Valid subnet: "<<subnet<<end1; //判断IP地址是否合法 if(!ipIsV) cout<<"IP address is invalid!"<<end1; else cout<<"Valid ip address: "<<ip<<end1; //判断IP底子是否属于子网 if(subIsV&&ipIsV&&maskIsValid) belong();}//判断是否含有非数字符bool ipTest::NoIlleagalChar(char *ch){ unsigned int i; unsigned int k=0; //判断美味是否为数字字符 for(i=0;i<strlen(ch);i++) if(isdigit(*(ch+i))==0) return false; return true; }//判断IP地址是否合法bool ipTest::ipIsValid(char* ip){      char ch[]=".";  char *token,*dot[4];  int iplen=0;//以“.”标志将ip字符串按节分开  token=strtok(ip,ch);  while(token!=NULL)  {  dot[iplen]=token;  iplen++;  token=strtok(NULL,ch);  }  //判断IP地址的段数  if(iplen!=4)  return false;  //有非法字符或者某段值非法  for(int i=0;i<4;i++)  if(!NoIllegalChar(dot[i])||atoi(dot[i])>255)  return false;  return true;}//判断子网号是否合法bool ipTest::subnetIsValid(char* subnet){ //调用判别IP地址合法性函数 if(!ipIsValid(subnet)) return false; return true;}//判断IP地址是否为子网成员void ipTest::belong(){ int subLen=strlen(subnet); int ipLen=strlen(ip); unsigned int iIPA,isubA,iMask; unsigned char subA[4],ipA[4]; char temp[3]; int i,j,t=0; for(i=0,j=0;i<subLen;i++) { //temp数组中放“.”间的串 if(subnet[i]!='.') temp[j++]=subnet[i]; else { subA[3-t]=atoi(temp); j=0; t++; temp[0]=temp[1]=temp[2]='\0'; } } subA[0]=atoi(temp); temp[0]=temp[1]=temp[2]='\0'; iSubA=*(unsigned int *)subA; for(i=0,j=0,t=0;i<ipLen;i++) { if(ip[i]!='.') temp[j++]=ip[i]; else { ipA[3-t]=atoi(temp); j=0; t++; temp[0]=temp[1]=temp[2]='\0'; } } ipA[0]=atoi(temp); iIPA=*(unsigned int*)ipA; //获得掩码 iMask=0xffffffff; iMask<<=(32-mask); //子网号与掩码不匹配 if((iSubA|iMask)!=iMask) { cout<<"Subnet and mask not match!"; return; } //子网号为全1 if((iSubA&iMask)==0) { cout<<"Subnet is all 0!"; return; } //IP地址与子网号比较 if((iSubA)==(iIPA&iMask)) { //IP地址全为1 if((iIPA|iMask)==0xffffffff) { cout<<"Ip address is all 1!"; return; } //IP地址全为0 if((iIPA|iMask)==iMask) { cout<<"Ip address is all 0!"; return; } //IP地址属于内网 cout<<ip <<" belong to "<<subnetPlusMask<<end1; return; }  else cout<<ip<<" not belong to"<<subnetPlusMask<<end1;}
查看完整描述

2 回答

?
丨椎名真白丨

TA贡献3条经验 获得超2个赞


放到编译器里运行了一遍之后错误多到不想说啥。。。中间有一行的括号和叹号是全角字符需要改。然后开始创建的变量有的名字错了,有的语句后面没加分号。总之照着报错慢慢改改吧。另外最好不要用void main()了,这玩意早就out了,看着都感觉头疼

查看完整回答
反对 回复 2016-04-13
  • 2 回答
  • 0 关注
  • 1841 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信