题解 | #合法IP#
合法IP
https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int HasHeadZeros(char *str);
int CheckIfIpAddress(char *addr);
int main() {
char buf[30] = {0};
scanf("%s", buf);
if(CheckIfIpAddress(buf))
{
printf("YES\n");
}else {
printf("NO\n");
}
return 0;
}
//一些可能的输入和输出:输入保证不含有空格
//192.168.0.1 ---> YES
//10.137.17.1---->YES
//ab.43.12.4 --->NO 包含字母
//99999.53.23.5---->NO 超过最大
//255.255.255.255--->YES 最大的IP地址,字符串长度 15个,如果超过15个,就不是
//0.0.0.0--->YES 最小的IP地址,字符串长度7个
//$bd.$$$.df.fdd-->NO 包含特殊符号
//""--->NO 空字符串:不睡
//4.3.2 NO 不是,点不够
//57432983# NO 没有.,
//...434 NO
//01.2.3.8 ---->有前导0的情况
//思路
//1. 检查参数是否为空指针。
//2. 检查字符串长度 是否在[7, 15]之间,如果不是,则返回0
//3. 检查.的个数,应该为3,如果不是,则返回0
//4. 按照. 进行分割字符串。设计一个 char addrpart[4][4];(循环查找,遇到.放进里面)
//5. 在放的过程中,检查放的是不是数字,并安排一个计数器,放的次数不能超过3.
/*
*@func:检查输入是否是一个有效ip地址
*@ret:如果是,则返回1, 如果不是,则返回0
*/
int CheckIfIpAddress(char *addr)
{
if(addr == NULL)
{
return 0;
}
int pointcnt = 0;
int len = strlen(addr);
if((len<7) || (len>15))
{
return 0;
}
char addrpart[4][4] = {0};
int numpart[4];
int k=0;
for(int i=0; i<len; i++)
{
if(addr[i] == '.')
{
pointcnt++;
if(pointcnt > 3)
{
return 0;
}
k=0;
}else if(!isdigit(addr[i]))
{
return 0;
}
else
{
addrpart[pointcnt][k++] = addr[i];
}
}
for(int i=0; i<4; i++)
{
if(strlen(addrpart[i]) == 0)
{
return 0;
}
else {
//排除前导0的情况
if(HasHeadZeros(addrpart[i]))
{
return 0;
}
numpart[i] = atoi(addrpart[i]);
if(numpart[i] > 255)
{
return 0;
}
}
}
return 1;
}
int HasHeadZeros(char *str)
{
int len = strlen(str);
if(len==1)
{
return 0;
}
if(str[0] == '0')
{
return 1;
}
return 0;
}

