最近有份代码需要判断字符串模式IP V4的有效性,使用了inet_addr发现不能全部判断,于是在网上查了下,有很多
这样的例子,各有优点,但找到的都多少有些问题。
其中有分代码清晰覆盖面相对很全。
下面的代码是我在这份代码的基础上做了些修改,后面会给出地址。简单测试没有什么问题,如有问题请各位留言指正。
bool isValidIPv4(const char *pszIPAddr)
{
if (!pszIPAddr) return false;
int size = strlen(pszIPAddr);
int first = 0, num = 0, pointCount = 0;
if (size > 15) return false; // max len "255.255.255.255"
for(int i = 0; i < size; i++)
{
// only '.', '0'..'9'
if (pszIPAddr[i] >= '0' && pszIPAddr[i] <= '9')
{
num = num * 10 + pszIPAddr[i] - '0';
}
else if (pszIPAddr[i] == '.')
{
pointCount++;
if (pointCount > 3) return false;
if (num > 255 || num < 0) return false;
if (pszIPAddr[first] < '0' || pszIPAddr[first] > '9') return false; // prefix '0'..'9'
if (num != 0 && pszIPAddr[first] == '0') return false; // 01.02.03.04
if (i + 1 < size) first = i + 1; else first = i; // next num start character
num = 0;
}
else
{
return false;
}
if (i + 1 == size)
{
// last num
if (num > 255 || num < 0) return false;
if (pszIPAddr[first] < '0' || pszIPAddr[first] > '9') return false;
if (num != 0 && pszIPAddr[first] == '0') return false;
}
}
if (pointCount != 3) return false;
return true;
}
参考博客地址,主要在这份代码上做了修改。
http://blog.csdn.net/neilol/article/details/48491347