Problem Description
在网络课程上,我学到了很多有关IP的知识。IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192.168.100.16,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。 但是粗心的我,常常将IP地址写错,现在需要你用程序来判断。
Input
输入有多个case,每个case有一行,不超过100个字符。
Output
对于每个case,判断输入的IP是否正确,如果正确输入YES,否则NO。
Sample Input
192.168.100.16
Sample Output
YES
//这是一道神坑之题!!
//我要冷静!!我要冷静!!不能摔电脑!!
//具体注意事项看代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
char data[105];
int flag,t;
while(gets(data))
{
flag=1;//假设是对的
for(int i=0;i<strlen(data);i++)//第一步,先找是否有特殊符号
{
if((data[i]<'0'||data[i]>'9')&&data[i]!='.')
flag=0;
}
//第二步,看是否有且只有三个'.'
int cnt=0;
for(int i=0;i<strlen(data);i++)
{
if(data[i]=='.')
cnt++;
}
if(cnt!=3)
flag=0;
//第三步,看两个点之间的长度是否是1~3位;
int num=0,l,k=0;;
char p[100];
l=strlen(data);
data[l]='.';
data[l+1]='\0';
t=0;
int wei=0;
for(int i=0;i<=strlen(data);i++)
{
if(data[i]!='.')
wei++;
else if(data[i]=='.'&&data[i-1]!='.')
{
if(wei<1||wei>3)
flag=0;
wei=0;
}
}
//第四步,看数字是不是1~255
for(int i=0;i<=strlen(data);i++)
{
if(data[i]!='.')
{
p[k]=data[i];
k++;
}
else if(data[i-1]!='.'&&i>0)
{
p[k]='\0';
num=atoi(p);
if(num>255)//if(num<1||num>255)此处是此题神坑位置。。。因为000.3.3.3是正确的。。
flag=0;
k=0;
t++;
}
}
if(t!=4)
flag=0;
if(flag==0)
cout<<"NO"<<endl;
if(flag==1)
cout<<"YES"<<endl;
}
return 0;
}
来源:https://www.cnblogs.com/nefu929831238/p/5329852.html