判断字符串是否为合法ip

周三去B商搜面试,连着面了三面,对体力也是一个不小的考验,三面也是技术面,其中代码题为判断字符串是否为合法IP

之前IP的题写过32位int转换为IP的,还好数字串判断是否能成为IP的DFS,字符串判断IP的还没遇见过

经过思考之后,先确定方向,是一道字符串处理的题,合法ip的话主要有以下几点:

1.合法IP只有'.'和'1-9'其他的字符都干掉

2.IP串为四个数字3个'.'不符合的干掉

3.连续的'..'干掉

4.数字在0-255以外的干掉

5.非0数字前有0的也干掉


然后开始手写,之前写的时候没考虑到010的情况,后来发现了加了一个逻辑判断,总的来说思路没啥问题,附上代码:

bool isValidIP(char* str){
	if (NULL==str)
	{
		return false;
	}
	bool preIsNum=false;
	int numOfPoint=0;
	int numOfNum=0;
	char *p=str;
	while ('\0'!=*p&&numOfPoint<=3&&numOfNum<=4)
	{
		if('.'!=*p&&(*p<'0'||*p>'9')){
			return false;
		}
		if('.'==*p){
			 if (!preIsNum)
			 {
				 return false;
			 }
			 else
			 {
				 preIsNum=false;
				 numOfPoint++;
			 }
			 p++;
		}
		else{
			int tmp=0;
			bool prevHasZero=0;
			while ('\0'!=*p&&*p>='0'&&*p<='9')
			{
				if (prevHasZero==true)
				{
					return false;
				}
				if (*p=='0'&&tmp==0)
				{
					 prevHasZero=true;
				}
				tmp=tmp*10+(*p-'0');
				p++;
			}
			if (tmp<0||tmp>255)
			{
				return false;
			}
			numOfNum++;
			preIsNum=true;
		}
	}
	if (numOfPoint==3&&numOfNum==4)
	{
		return true;
	}
	else{
		return false;
	}
}

附上检查代码和结果:



int main(){
	char a[][10] ={"0","000000"};
	char *b[] ={"","a","000","0.123.456.2","000.000.0.0",".0.0.3.2",".0.0.0.0","1.1.256.1","1.2.a.2","00.0.0.0","0.00.0.0","010.010.010.010"};
	char *c[] ={"0.0.0.0","1.1.1.1","100.100.100.100","255.255.255.255"} ;
	ofstream outfile;
	outfile.open("out.txt");
	cout<<setw(20)<< setiosflags(ios::left)<<"无效IP"<<setw(20)<<"判断结果"<<endl;
	outfile<<setw(20)<< setiosflags(ios::left)<<"无效IP"<<setw(20)<<"判断结果"<<endl;
	for (int i=0;i<sizeof(b)/sizeof(b[0]);i++)
	{
		cout<<setw(20)<< setiosflags(ios::left)<<b[i]<<setw(20)<<isValidIP(b[i])<<endl;
		outfile<<setw(20)<< setiosflags(ios::left)<<b[i]<<setw(20)<<isValidIP(b[i])<<endl;
	}
	cout<<setw(20)<< setiosflags(ios::left)<<"有效IP"<<setw(20)<<"判断结果"<<endl;
	outfile<<setw(20)<< setiosflags(ios::left)<<"有效IP"<<setw(20)<<"判断结果"<<endl;
	for (int i=0;i<sizeof(c)/sizeof(c[0]);i++)
	{
		cout<<setw(20)<< setiosflags(ios::left)<<c[i]<<setw(20)<<isValidIP(c[i])<<endl;
		outfile<<setw(20)<< setiosflags(ios::left)<<c[i]<<setw(20)<<isValidIP(c[i])<<endl;
	}
	outfile.close();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值