int isValIP(const char* ip)
{
static char tab[24][11] = {{1,2,3,4,4,4,4,4,4,4,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5},
{4,4,4,4,4,4,4,4,4,4,5},
{4,4,4,4,4,6,1,1,1,1,5},
{1,1,1,1,1,1,1,1,1,1,5},
{7,8,9,10,10,10,10,10,10,10,-1},
{1,1,1,1,1,1,-1,-1,-1,-1,5},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11},
{10,10,10,10,10,10,10,10,10,10,11},
{10,10,10,10,10,12,7,7,7,7,11},
{7,7,7,7,7,7,7,7,7,7,11},
{13,14,15,16,16,16,16,16,16,16,-1},
{7,7,7,7,7,7,-1,-1,-1,-1,11},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,17},
{16,16,16,16,16,16,16,16,16,16,17},
{16,16,16,16,16,18,13,13,13,13,17},
{13,13,13,13,13,13,13,13,13,13,17},
{19,20,21,22,22,22,22,22,22,22,-1},
{13,13,13,13,13,13,-1,-1,-1,-1,17},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{22,22,22,22,22,22,22,22,22,22,-1},
{22,22,22,22,22,23,19,19,19,19,-1},
{19,19,19,19,19,19,19,19,19,19,-1},
{19,19,19,19,19,19,-1,-1,-1,-1,-1}};
if(ip != NULL)
{
int stat = 0;
for(const char* tmp = ip; *tmp != ‘\0′ && stat >= 0; ++tmp)
{
if(’0′ <= *tmp && *tmp <= ’9′)
stat = tab[stat][*tmp - '0'];
else if(*tmp == ‘.’)
stat = tab[stat][10];
else
stat = -1;
}
if(stat >= 19 && stat <= 23)
return 1;
}
return 0;
}
回复人: txj_killer(流浪的天行) ( ) 信誉:100 2005-12-30 17:20:16 得分: 0
我就是写的正则表达式,然后转换为有限自动机,具体算法参见形式语言与自动机理论、编译原理等书籍。