高手请进:公司中的实际问题!问题解决立即给重分!

nyz_251 2004-08-11 05:51:41
判断用户从终端输入的IP地址的是否有效。
要求:
程序性能很高,用C语言实现
...全文
211 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Leaveye 2004-08-11
  • 打赏
  • 举报
回复
char * const ip_fmt ="%3[^.].%3[^.].%3[^.].%3s"; // xxx.xxx.xxx.xxx (0=<xxx <=255)
得加[]。后面还没看。
lbaby 2004-08-11
  • 打赏
  • 举报
回复
试着也写了一个
#include <stdio.h>

const int ip_max_len = 15; //ip 最长为15
const int ip_dot_nm = 3; // 三个点
const char dot = '.';
char * const ip_fmt ="%3[^.].%3[^.].%3[^.].%3s"; // xxx.xxx.xxx.xxx (0=<xxx <=255)

int is_available_ip(const char *ip_str)
{
int dot_cnt=0;
int len=0;
int ip_tmp;
int i;
char *ptr = ip_str;
static char ip_ar[4][3];

while( *ptr)
{
++len;
if( (*ptr > '9') || (*ptr < '0') )
{
if( *ptr == dot)
{++dot_cnt;}
else
{ break;}
}
++ptr;
}

if(*ptr) //上边的循环非正常退出,含有除了 '.'和'0-9'的以外的非法字符
{ return 0;}

if(dot_cnt != ip_dot_nm) //'.'的个数非法
{ return 0;}

if(len > ip_max_len) //ip长度非法
{ return 0; }

ptr = ip_str;
sscanf(ptr,ip_fmt,ip_ar[0],ip_ar[1],ip_ar[2],ip_ar[3]);
for(i = 0; i < 4; i ++)
{
sscanf(ip_ar[i],"%d",&ip_tmp);
if(ip_tmp > 255)
{ break;}
}

if( i != 4) //上边的有一个数是非法的
{ return 0;}

return 1; //噢,这是个真正的公主
}



int main(void)
{
char tmp[16];
scanf("%s",tmp);
is_available_ip(tmp) ?
puts("ok,it's an avaliable ip address") :
puts("no,it's an unavaliable ip address") ;
return 0;
}


xyz_mw 2004-08-11
  • 打赏
  • 举报
回复
这个我刚做过
#include <string>
#include <sstream>
#include <functional>
#include <algorithm>
using namespace std ;

bool VerifyIP(string sIp)
{
istringstream ssIp(sIp) ;
string sNum ;
int i = 0 ;
while(getline(ssIp , sNum, '.'))
{
i++ ;

//isdigit
string::iterator iter = find_if(sNum.begin(), sNum.end(), not1(ptr_fun(isdigit))) ;
if(iter != sNum.end())
return false ;

// <= 255
istringstream ssNum(sNum) ;
int nNum ;
ssNum >> nNum ;
if(nNum > 255)
return false ;

}


//4
if(i != 4)
return false ;

return true ;
}
铖邑 2004-08-11
  • 打赏
  • 举报
回复
if(inet_addr("*.*.*.*") != INADDR_NONE)有效
else 无效
freefalcon 2004-08-11
  • 打赏
  • 举报
回复
socket函数inet_addr用于将IP字符串转换成32位IP整数,如果出错,将返回0xFFFFFFFF,所以使用它就能判断IP地址是否有效,唯一的缺点是广播地址"255.255.255.255"的值也是0xFFFFFFFF,不能分辨,linux下inet_pton可以解决这个问题

自己判断也不难吧,split后将各部分转换成数字,判断其范围,任何一步出错都返回失败
flyelf 2004-08-11
  • 打赏
  • 举报
回复

if ( sscanf(...) != 4 )
printf("非法输入\n");

//然后分别判断每个数值是否在0-255之间

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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