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

nyz_251 2004-08-11 05:51:41
判断用户从终端输入的IP地址的是否有效。
要求:
程序性能很高,用C语言实现
...全文
214 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之间
前导课程:      《Java工程师系列课程》前4部课程内容:       本课程是《Java工程师系列课程》的第7部分,主要讲解Java实际开发过程常用类,特别是各种工具类的使用。熟练掌握这些类的使用方法,能够大幅度提高编程效率。同时还在课程穿插讲解了很多Java语言的设计思想和理念,深刻理解并掌握这些编程思想能够从根本上提高编程水平和解决问题的能力。在课程的末尾还安排了国际化软件实战项目。       本课程涉及的主要内容如下表所示:课程说明:      在开发Java程序的过程,无论做什么类型的项目,都会用到各种工具类来解决一些实际问题。这些工具类被广泛的应用与各种行业软件的开发。比如我们经常会用BigDecimal类来的完成浮点数的精确计算,也会用Formatter类完成文本、数字、日期的格式化操作等等。      为了能够让学员迅速掌握这些工具类的使用,我们特意开发了这门视频课程,视频详细讲解了20余种常用工具类的使用规则。此外,在课程,还讲解了很多Java语言的设计思想和理念,可以让学员在听课过程能够对Java语言有更加深刻的理解和认识。      最后,本课程还安排了一个小型国际化软件的实战项目,通过实战让学员掌握国际化软件的开发理念和实际操作流程预期效果:      认真学习完本课程,学员可以掌握20种Java实战开发常用类的使用方法,实实在在提高实战水平,完成从菜鸟到高手的华丽转变。配套福利:英文双语版本自助购物软件的完整源码环境配置要求:      学习本课程需安装JDK13或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。     因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

33,311

社区成员

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

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