概述
1.测试用例
.1.1.111//测试开头为点的情况
.1.1.1//长度不够+开头为点
1.1.1.//结尾为点+长度不够
11.11.11.//结尾为点
11..11.1//中间存在连续点
..111.111//开始存在连续点
111.111..//结尾存在连续点
1.11111.11111.1111//数值不合法,长度不合法
1.257.1.1//数值不合法
122.524.13.1//数值不合法
1.1.1.256//数值不合法
111.112.113//数值元数和点数不对
111.112//数值元数和点数不对
111.//数值元数和点数不对
01.3.2.56//开头有非法的零
-100.22.45.134//非法字符
1.1.1.1//合法
2.3.5.1//合法
111.111.1.255//合法
0.1.3.4//合法
114.114.114.114//合法
注:notepad++中,把//[S]*rn替换为rn可去除注释
2.修改后的代码
//#define __IP_DEBUG__
int Char_Num_Check(const char c);/*字符是否为数字*/
int Section_Legal_Check(const int sec);/*地址段是否合法*/
inline int Char_Num_Check(const char c) {return (c >= '0' && c <= '9');}
inline int Section_Legal_Check(const int sec) {return (sec >= 0 && sec <= 255);}
/**************************************************
IP合法性鉴别函数
功能:判断一个IP是否合法并打印出不合法的原因
原因包括:1.字符串长度非法
2.非法数字规则(零在最高位)
3.非法的取值(不在0~255之间)
4.非法的点(连续的点)
5.非法的地址段/点数目
**************************************************/
enum NextCharType
{
NUM=1,
DOT=0,
NUMORDOT=-1
};
int is_valid_ip(const char *ip)
{
int section = 0;
int DotCount = 0;//实现点计数
int NumCount=0;//实现section计数
int num_dot=NUM;//此时应接收数字还是点,1表示应该接收数字,0表示应该接收点,-1表示任意
int count=3;//用于计算每个数字段的位数,避免单个数字段过长
int flag_num=0;//读取过数字就置为1,方便后续检验合法性
if(strlen(ip)>15||strlen(ip)<7)//预判,ip太短或太长
{
#ifdef __IP_DEBUG__
printf("illegal length!n");
#endif
return 0;
}
while (*ip)
{
while(*ip!='.'&&*ip!='