描述
IPV4地址可以用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此正号不需要出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。
现在需要你用程序来判断IP是否合法。
数据范围:数据组数:1≤t≤18
进阶:时间复杂度:O(n) ,空间复杂度:O(n)
输入描述:
输入一个ip地址,保证不包含空格
输出描述:
返回判断的结果YES or NO
示例1
输入:
255.255.255.1000
输出:
NO
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
int main() {
char str[40];
/*
——1.输入
*/
scanf("%s",str);
/*
——2.提取IP地址4部分
*/
int m=0,n=0;
char num[4][20]={0}; //IP地址的4个部分
for(int i=0 ; i<strlen(str) ; i++)
{
if(str[i]=='.')
{
m++;
n=0;
}
else {
num[m][n] = str[i];
n++;
}
}
/*
——3.判断IP地址合法性:
看IP地址是否4部分——看m==3?
不是4部分 ==> 不合法
是4部分 ==> 看IP地址4部分是否有空:
若有空 ==> 不合法
全非空 ==> 看取值范围是否属于[0 , 255]:
不属于 ==> 不合法
属于 ==> 看10以内的数字表示是否正确:!!!容易忽略
若10以内数字表示为类似01、001则不合法
*/
int flag=1; //用于标志合法性:1-合法,0-不合法
if(m==3) //判断IP地址是否4部分
{
for(int i=0 ; i<=m ; i++) //判断4部分是否有空
{
//printf("%s\n", num[i]);
if(strlen(num[i]) == 0) //为空,即长度为0
{
flag=0;
break;
}
}
if(flag==1) //若4部分均非空,判断取值范围
{
for(int i=0 ; i<=m ; i++)
{
//printf("%d\n",atoi(num[i]));
if( atoi(num[i]) < 0 || atoi(num[i]) > 255) //atoi()函数将数字字符串转换成数字
{
flag=0;
break;
}
else {
//数字都在取值范围,但是表10以内的数字表示不对,如01、001
if(atoi(num[i]) && atoi(num[i]) <10 && strlen(num[i])>1)
{
flag=0;
break;
}
}
}
}
}
else {
flag=0;
}
/*
——4.输出
*/
if(flag==1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
不合法测试样例
不合法 | 不合法原因 |
1.3.6 | 非4部分 |
.1.3.6 | 存在为空的部分 |
01.2.5.7 | 存在10以内的整数表示不符合要求的部分 |
1.2.3.1009 | 存在数据范围不属于[0,255]的部分 |