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

#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;

}


永远的魔兽玩家
浏览 1842回答 2
2回答

丨椎名真白丨

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