您的位置:首页 > 其它

【华为oj】合法ip

2015-08-09 21:12 441 查看
问题描述

现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。

现在需要你用程序来判断IP是否合法。

知识点 字符串,循环,链表,队列,栈,查找,搜索,排序,树,图,数组,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归

运行时间限制 10M

内存限制 128

输入

输入一个ip地址

输出

返回判断的结果YES or NO



样例输入 10.138.15.1

样例输出 YES

问题分析:没什么特别的,就是要考虑的情况因素很多。看main函数

#include <iostream>
#include <string>
using namespace std;
# define maxsize 100

bool isnum( char num)
{
	if(('0'<=num)&&(num<='9'))
		return true;
	else 
		return false;
}
int change(string str)
{
	int a[3];
	int i=0;
	for(i=0;i<3;i++)
		a[i]=int(str[i])-48;
	return a[0]*100+a[1]*10+a[2];
}
bool ispartip(string str)//判断子字符串是否合法
{
	int len=str.length();
	if(len>3)
		return false;//超过三位数,return false
	else
	{
		int i=0;
		for(i=0;i<len;i++)//判断是不是全是数字
		{
			if(!isnum(str[i]))
				return false;
		}
//把三位的数字字符转化为数字
		if(len==3)
		{
			int numip=change(str);
			if(numip>255) return false;
		}
	}
	return true;
}

bool isipzero(string str)//ip地址全是0
{
	int i=0;
	for(i=0;i<str.length();i++)
	{
		if(str[i]!='0'&& str[i]!='.')
			return true;
	}
	return false;
}

int main()
{
	string s;
	getline(cin,s);
	int pos[maxsize]={0};//记录三个point的位子
	int l=s.length();
	int i=0,k=0;
	for(i=0;i<l;i++)
	{
		if(s[i]=='.')
		{
			pos[k]=i;
			k++;
		}
	}
	if(k==3)//找到三个point".",则继续判断,否则一定不是合法ip【点的个数】
	{
		if(pos[2]-pos[1]==1||pos[1]-pos[0]==1)//三个点相邻,一定不是合法ip【点的位置】
		{
			cout<<"NO"<<endl;
			return 0;
		}
		else
		{
			if(isipzero(s))//【判断s中是不是全为0.比如0.0.0.0或者00.00.0.000这样的不是合法ip】
			{
			if(ispartip(s.substr(0,pos[0]))&&ispartip(s.substr(pos[0]+1,pos[1]-pos[0]-1))&&ispartip(s.substr(pos[1]+1,pos[2]-pos[1]-1))&&ispartip(s.substr(pos[2]+1,l-pos[2]-1)))
				//按三个point的位子,分割出四个子字符串,并分别判断四个子字符串是否合法
			{
				cout<<"YES"<<endl;
			    return 0;
			}
			else
			{
				cout<<"NO"<<endl;
				return 0;
			}
			}
			else
			{
				cout<<"NO"<<endl;
				return 0;
			}
		}

	}
	else
	{
		cout<<"NO"<<endl;
		return 0;
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: