题目意思
给你一串IP,判断它在IPV4下是否合法。
解题思路
我们分析一下IP合法的情况:
1.该IP中’.’的个数必须为3个
2.除去’.’之外的四部分必须全部为数字,不能够为其他的字符,且数字的范围必须在0~255之间
3.IP的首位一定不能够为’.’
4.”0000”这种情况虽然转换为数字为0,但是这是不合法的,也就是说我们要保证数字必须为三位及以下
5.不能够出现连续的两个’.’
特别要注意的一点就是,我们读入IP的时候要用gets来读取,如果直接用scanf,那么中间如果存在空格他就将你输入的IP当做两个来处理了,所以我做的时候一直错,找错找到心态爆炸。。。
代码部分
先来一个我自己写的代码,就是将所有情况考虑之后来写的。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define ll long long
using namespace std;
bool isNum(char a)///判断是否为数字
{
if(a>='0'&&a<='9')
return true;
else
return false;
}
bool isHe(char a[])
{
int n=strlen(a);
if(a[n - 1] == '.')///如果最后一位为.是不合法的
return false;
int j=0;///j用来记录总的点数。
int b[5] = {0};///数组b用来记录IP每位上的数字
int numCount=0,dotNum=0;///numCount表示数字个数,dotNum表示点数
for(int i=0; i<n; i++)
{
if(isNum(a[i]))
{
b[j]=b[j]*10+(int)(a[i]-'0');
numCount++;
if(numCount>3)
return false;
dotNum=0;
}
else if(a[i]=='.')
{
j++;
dotNum++;
numCount=0;
if(i==0)///如果首位为.说明IP不合法
return false;
if(dotNum>1)///如果有两位连续的.IP也是不合法的
return false;
}
else
return false;
}
if(j!=3)///IP中的总点数不为3,IP不合法
return false;
for(int i=0; i<4; i++)
if(b[i]<0||b[i]>255)
return false;
return true;
}
int main()
{
char s[105];
while(gets(s))///这里要用gets读入字符串,这样才能吞空格
{
if(isHe(s))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
后来我又发现一个比较简单的代码,我们可以看看,用这种方式写要省很多的力气哦。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define ll long long
using namespace std;
int main()
{
char s[105],h[105];
int c1,c2,c3,c4;
while(gets(s))
{
sscanf(s,"%d.%d.%d.%d",&c1,&c2,&c3,&c4);///以.分割字符串分别存入c1,c2,c3,c4中,以int类型存入
if((c1>=0&&c1<=255)&&(c2>=0&&c2<=255)&&(c3>=0&&c3<=255)&&(c4>=0&&c4<=255))///判断每个字段是否符合条件
{
sprintf(h,"%d.%d.%d.%d",c1,c2,c3,c4);///将c1,c2,c3,c4中间以.相接拼接成字符串存入字符串h中
if(strcmp(s,h)==0)///比较字符串s和h是否相等
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
return 0;
}