饼子堂比武贴——判断合法的IP地址

laomai 2005-12-30 02:17:55
这次的比武内容是写一个函数,判断输入的字符串(传入时已经保证为空,且以\0结束)是否为合法的IP地址。语言为C。
具体要求:
1、如果字符串范围在”0.0.0.0到255.255.255.255“内,为合法,返回1;否则非法,返回0。
2、每个不能非零数字前不能有0,如032.32.34.56或者12.028.93.78均视为不规范写法
3、尽量不要使用c的库函数
4、尽量不要重新复制一遍字符串
5、尽量不要修改原字符串
6、使用合适个数个局部变量
7、尽量做到占用的内存少,速度快,效率高
目前帖子先给0分,待有好的答案后酌情加分,呵呵

...全文
3199 168 打赏 收藏 举报
写回复
用AI写文章
168 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuhx 2006-07-06
  • 打赏
  • 举报
回复
mark一下,有空来做。。。
pottichu 2006-07-05
  • 打赏
  • 举报
回复
Mark 一下,呵呵。
interestc 2006-07-04
  • 打赏
  • 举报
回复
高手,高高手,一个比一个拽,自卑中.....
关门苦练内功。
caiyujie87 2006-07-02
  • 打赏
  • 举报
回复
mark
tailzhou 2006-06-27
  • 打赏
  • 举报
回复
每个不能非零数字前不能有0,如032.32.34.56或者12.028.93.78均视为不规范写法

00.00.00.00 算不算?
tailzhou 2006-06-27
  • 打赏
  • 举报
回复
班门弄斧:

#include <stdio.h>

int IsValidIP(const char* sp)
{
char fst;
int sum,num;
sum=0;
num=0;
if ((fst=*sp)=='.') return 0;

while (*sp!='\0')
{
if (*sp=='.')
{
if (fst=='0' && sum>0) return 0;
if (++num>3) return 0;
sum=0;
if ((fst=*(sp+1))=='.') return 0;
++sp;
continue;
}
else if (*sp<'0' || *sp>'9') return 0;

sum=sum*10+*sp-'0';
if (sum>255) return 0;
++sp;
}
if (num!=3 || (fst=='0' && sum>0)) return 0;
return 1;
}

int main()
{
char ip[16];

scanf("%s",&ip);
if (IsValidIP(ip))
{
printf("Y\n");
}
else
{
printf("N\n");
}
return 0;
}
robin97 2006-06-24
  • 打赏
  • 举报
回复
来晚了,不过也凑凑热闹,
主程序部分,
1、没有使用函数
2、使用变量空间很少
3、一遍扫描

#include "stdio.h"
#include "windows.h"

int iplegal(const char * ip);

void main()
{
char * ip[]={
"1.2.3.4.5",
"56,41.154.5",
"2.3.6.5.",
"255.256.1.1",
"5..1.1",
"1.02.3.5",
".2.ab.12.4",
"2147483657.1.2.3",
"00.11.22.33",
"0.255.0.255",
"1.2.3.5",
"255.255.255.255",
"0.0.0.0"
};

for( int i = 0 ; i < 13 ; i++)
{
if(iplegal(ip[i]))
printf(" legal : %s \n",ip[i]);
else
printf("unlegal : %s \n",ip[i]);
}

printf("速度测试 调用1300万次...\n");
DWORD start = GetTickCount();

for( i = 0 ; i < 1000000 ; i++)
{
for( int j = 0 ; j < 13 ; j++)
{
iplegal(ip[j]);
}
}

printf("耗时 %d 毫秒\n",GetTickCount() - start);
}

// 测试程序
int iplegal(const char * ip)
{

#define FLAG_FOUND_DOT 0x0001
#define FLAG_FOUND_ZERO 0x0002

const char * str = ip;
char c;
short n = 0;
char zflag = 0;
char dot = 0;

c = *ip;

if( c == ' ' || c == '.')
return 0;

for(c = *str ; *str ; c = *++str)
{

if( c == '.')
{
if( zflag & FLAG_FOUND_DOT)
return 0;

zflag = FLAG_FOUND_DOT;
n = 0;
dot++;
continue;
}

if( c <'0' || c >'9') return 0; // 非法字符

zflag &= ~FLAG_FOUND_DOT;

if( (zflag & FLAG_FOUND_ZERO) && c != '.') return 0;

if( c == '0' && !(zflag & FLAG_FOUND_ZERO)) zflag |= FLAG_FOUND_ZERO; // 首字节为0

n = n*10 + c - '0';

if( n > 255) return 0; //

if( n > 0 && zflag & FLAG_FOUND_ZERO) return 0; // 0后面跟有其他数字

if( c == ' ' ) return 0; // 中间出现空格,非法


}

if(dot != 3) return 0; // .不等于3个

return 1;
}
junku_kong 2006-05-11
  • 打赏
  • 举报
回复
学习中
visual4825 2006-05-11
  • 打赏
  • 举报
回复
Dim strIP As String = TextBox1.Text.Trim
Dim re As Regex = New Regex("^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]).(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$")
If re.IsMatch(strIP) Then
Label1.Text = "valid IP address"
Else
Label1.Text = "invalid IP ad\dress"
End If
herman~~ 2006-05-10
  • 打赏
  • 举报
回复
深蓝的蔡鸟
过来学习一下的
languagec 2006-05-09
  • 打赏
  • 举报
回复
还没比完?
pacman2000 2006-04-23
  • 打赏
  • 举报
回复
用regexp()来做。。。
正则式为:
(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
thirdlee 2006-04-10
  • 打赏
  • 举报
回复
int IsIP(char* szIP)
{
int d1,d2,d3,d4;
if(szIP == NULL)
return 0;
if(sscanf(szIP, "%d.%d.%d.%d", &d1,&d2,&d3,&d4) != 4)
return 0;

if(d1<0 || d1>255 || d2<0 || d2>255 || d3<0 || d3>255 || d4<0 || d4>255)
return 0;

return 1;
}
Kvci 2006-03-31
  • 打赏
  • 举报
回复
“尽量做到占用的内存少,速度快,效率高”???

怎么算效率最高?
怎么算速度快?
怎么测试其效率?
想着这问题有点迷惑了。
测试的时候是单个数据测试?然后看那次判断的时间?
或者是几千几万甚至几百万数据?


代码最短就是效率最快吗?
lei001 2006-03-29
  • 打赏
  • 举报
回复
mark
shenmea00000 2006-03-27
  • 打赏
  • 举报
回复
汗~~~~~~~
limlzm 2006-03-23
  • 打赏
  • 举报
回复
mark
sjjf 2006-03-23
  • 打赏
  • 举报
回复
嗯,一个简单的状态机,有空再试试。
dingming 2006-03-23
  • 打赏
  • 举报
回复
刚才发的,格式好难看,重新发。

#include "stdafx.h"

int CheckIP(char * sIP);
int main(int argc, char* argv[])
{
int iRet=0;
char *strIP="289.3.0.0.0";
iRet=CheckIP(strIP);
printf("IP:%s is (1:true;0:false) %d\n",strIP,iRet);
return 0;
}

int CheckIP(char * pSourceIP)
{
// 输入的字符串
char * pIP=pSourceIP;
// 字符.的位置
char * pDot=pSourceIP;
// 把输入分为4个部分,处理其中的一个
char * pTemp=NULL;
// 把输入分为4个部分,处理其中的一个,计算当前的数值是否在255内
char * pTemp10=NULL;
// 小数点的个数
int nDotNum=0;
// 每个部分的数值,如:"127.0.0.1"中字符串"127"的值为127
int nValue=0;
// 每个字符的值, 如:"127.0.0.1"中字符"2"的值为20
int nSubValue=0;
if(pIP==NULL) return 0;
while(*pIP!='\0')
{
/*非法字符*/
if((*pIP<'0' || *pIP>'9' ) && *pIP != '.' ) return 0;
if(*pIP=='.')
{
if((pIP-pDot)<1) return 0;
// 首字符是.或者连续多个.
if(*(pIP+1)=='\0') return 0;
// 结尾是.
pDot=pIP+1;
// 记录.
nDotNum++;
// .个数++
if(nDotNum>3) return 0;
// .个数大于3
}
else // 处理的数字字符
{
// 得到每部分的字符串的开始位置
if(pDot==pSourceIP)
{
pTemp=pSourceIP;
}
else
{
pTemp=pDot;
}
nValue=0;
// 每部分字符串的字符个数不能超过3个
if((pIP-pTemp)>2)
{
return 0;
}
// 开始计算当前部分字符串的10进制数值
while(pTemp<=pIP)
{
// 得到字符数值
nSubValue=(*pTemp)-'0';
pTemp10=pTemp;
// 计算其权
while(pTemp10<pIP)
{
nSubValue=nSubValue*10;
pTemp10++;
}
// 得到字符串的数值
nValue=nValue+nSubValue;
pTemp++;
}
// 首字符是'0'
if(nValue>0 && (*(pDot)=='0')) return 0;
// 连续2个0
if(nValue==0 && (pIP-pDot)>0) return 0;
// 字符串大于255
if(nValue>255) return 0;
}
pIP++;
}
return 1;
}
dingming 2006-03-23
  • 打赏
  • 举报
回复
我也贴一个,见笑了:)

#include "stdafx.h"

int CheckIP(char * sIP);
int main(int argc, char* argv[])
{
int iRet=0;
char *strIP="128.3.0.0";
iRet=CheckIP(strIP);
printf("IP:%s is (1:true;0:false) %d\n",strIP,iRet);
return 0;
}

int CheckIP(char * pSourceIP)
{
char * pIP=pSourceIP; // 输入的字符串
char * pDot=pSourceIP; // 字符.的位置
char * pTemp=NULL; // 把输入分为4个部分,处理其中的一个
char * pTemp10=NULL; // 把输入分为4个部分,处理其中的一个,计算当前的数值是否在255内
int nDotNum=0; // 小数点的个数
int nValue=0; // 每个部分的数值,如:"127.0.0.1"中字符串"127"的值为127
int nSubValue=0; // 每个字符的值, 如:"127.0.0.1"中字符"2"的值为20
if(pIP==NULL) return 0;

while(*pIP!='\0')
{
if((*pIP<'0' || *pIP>'9' ) && *pIP != '.' ) return 0;/*非法字符*/
if(*pIP=='.')
{
if((pIP-pDot)<1) return 0; // 首字符是.或者连续多个.
if(*(pIP+1)=='\0') return 0; // 结尾是.
pDot=pIP+1; // 记录.
nDotNum++; // .个数++
if(nDotNum>3) return 0;
}
else // 处理的数字字符
{
// 得到每部分的字符串的开始位置
if(pDot==pSourceIP)
{
pTemp=pSourceIP;
}
else
{
pTemp=pDot;
}

nValue=0;
if((pIP-pTemp)>2) // 每部分字符串的字符个数不能超过3个
{
return 0;
}
while(pTemp<=pIP) // 开始计算当前部分字符串的10进制数值
{
nSubValue=(*pTemp)-'0'; // 得到字符数值
pTemp10=pTemp;
while(pTemp10<pIP) // 计算其权
{
nSubValue=nSubValue*10;
pTemp10++;
}
nValue=nValue+nSubValue; // 得到字符串的数值
pTemp++;
}
if(nValue>0 && (*(pDot)=='0')) return 0; // 首字符是'0'
if(nValue==0 && (pIP-pDot)>0) return 0; // 连续2个0
if(nValue>255) return 0; // 字符大于255

}
pIP++;
}
if(nDotNum!=3)
{
return 0;
}
else
{
return 1;
}

}
加载更多回复(148)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧