0 0

精通C的大虾们,加进来看看...10

如何用C预言来实现,把IP地址的点表示法转换成一个无符号整数;(ex:172.17.72.1=》172被存放在高8位,1被放在低8位)(要求不能使用库函数)


感谢你们的帮助........

问题补充:<div class="quote_title">王者之剑 写道</div><div class="quote_div">#include &lt;stdio.h&gt; <br /> <br />unsigned int int_ip_addr(const char* pip) <br />{ <br />&nbsp; unsigned int ret = 0; <br />&nbsp; unsigned int byte = 0; <br />&nbsp; int byte_count = 0 ; <br />&nbsp; int digit_count = 0; <br />&nbsp; while(*pip != '\0'){ <br />&nbsp;&nbsp;&nbsp; /* 非法字符 */ <br />&nbsp;&nbsp;&nbsp; if(*pip !='.' &amp;&amp; (*pip &lt;'0' || *pip &gt;'9')){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; if(*pip == '.'){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte_count++; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*'.'前没有数字或者这一小节的数字值过大或者'.'过多*/ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(digit_count == 0 || byte &gt; 255 || byte_count&gt;3){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = (ret&lt;&lt;8)|byte; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte = 0; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digit_count = 0; <br />&nbsp;&nbsp;&nbsp; }else{ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; digit_count++; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*数字个数过多*/ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(digit_count&gt;3 ){ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte *= 10; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte += *pip-'0'; <br />&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; pip++; <br />&nbsp; } <br />&nbsp; return (ret&lt;&lt;8)|byte; <br />} <br /> <br />void my_print(char* pip, unsigned int ip) <br />{ <br />&nbsp; printf("str ip: %s\n", pip); <br />&nbsp; printf("int ip: %u ", ip); <br />&nbsp; printf("convert to str: %d.", (ip&amp;0xff000000)&gt;&gt;24); <br />&nbsp; printf("%d.", (ip&amp;0x00ff0000)&gt;&gt;16); <br />&nbsp; printf("%d.", (ip&amp;0x0000ff00)&gt;&gt;8); <br />&nbsp; printf("%d\n", (ip&amp;0x000000ff)); <br />} <br />int main(void) <br />{ <br />&nbsp; int i; <br />&nbsp; char* pip[11] = {"172.1236.55.32",".36.55.32","172.y4.55.32", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "192...","192.168.10.12", "192.168.10.0.", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "255.255.255.255","192.ab1.0.0", "192.168..255", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "192168016600999999","255.355.2.254"}; <br />&nbsp; for(i=0;i&lt;11;i++){ <br />&nbsp;&nbsp;&nbsp; my_print(pip[i], int_ip_addr(pip[i])); <br />&nbsp; } <br />&nbsp; <br />} <br /></div> <br /> <br />能不能注释多一点呢....我新手吖,哈哈``` <br />解释清楚一点呐``` <br />准备给分你哦.. <br />
C 
2010年1月16日 20:16

2个答案 按时间排序 按投票排序

0 0

#include <stdio.h>

unsigned int int_ip_addr(const char* pip)
{
  unsigned int ret = 0;
  unsigned int byte = 0;
  int byte_count = 0 ;
  int digit_count = 0;
  while(*pip != '\0'){
    /* 非法字符 */
    if(*pip !='.' && (*pip <'0' || *pip >'9')){
       return 0;
    }
    if(*pip == '.'){
      byte_count++;
      /*'.'前没有数字或者这一小节的数字值过大或者'.'过多*/
      if(digit_count == 0 || byte > 255 || byte_count>3){
         return 0;
      }
      ret = (ret<<8)|byte;
      byte = 0;
      digit_count = 0;
    }else{
      digit_count++;
      /*数字个数过多*/
      if(digit_count>3 ){
        return 0;
      }
      byte *= 10;
      byte += *pip-'0';
    }
    pip++;
  }
  return (ret<<8)|byte;
}

void my_print(char* pip, unsigned int ip)
{
  printf("str ip: %s\n", pip);
  printf("int ip: %u ", ip);
  printf("convert to str: %d.", (ip&0xff000000)>>24);
  printf("%d.", (ip&0x00ff0000)>>16);
  printf("%d.", (ip&0x0000ff00)>>8);
  printf("%d\n", (ip&0x000000ff));
}
int main(void)
{
  int i;
  char* pip[11] = {"172.1236.55.32",".36.55.32","172.y4.55.32",
                 "192...","192.168.10.12", "192.168.10.0.",
                 "255.255.255.255","192.ab1.0.0", "192.168..255",
                 "192168016600999999","255.355.2.254"};
  for(i=0;i<11;i++){
    my_print(pip[i], int_ip_addr(pip[i]));
  }
 
}

2010年1月17日 18:55
0 0

unsigned long get_ip_addr(char *pip)
{
    int    i = 0,k = 0;
    unsigned char c_tmp;
    unsigned long l_tmp = 0;
    unsigned long r_ip  = 0;
   
    while('\0' != *pip)
    {
        c_tmp = *pip++;
        if('.' == c_tmp)
        {
            if(++k <= 3)
            {
                r_ip |=  l_tmp;
                r_ip <<= 8;
                i   = 0;
                l_tmp = 0;
            }
            else
            {
                return(0);        // 错误 IP
            }
        }
        else if(++i < 4)
        {
            l_tmp *= 10;
            l_tmp += (c_tmp - '0');
        }
        else
        {
            return(0);            // 错误 IP
        }
    }
    r_ip |=  l_tmp;
    return(r_ip);
}

2010年1月16日 22:22

相关推荐

    JMSAP36-令狐大虾.doc

    JMSAP36-令狐大虾.doc

    哪位大虾帮忙破解一下....万分感激

    那位好心的大虾帮帮忙....破解一下,小弟感激不尽,谢谢!谢谢!谢谢!

    大虾电子网30章C51入门教程.zip

    《大虾电子网30章C51入门教程》是一份专为初学者设计的教程,旨在帮助读者快速掌握C51编程语言的基础知识和应用技巧。C51是为8051微控制器系列设计的一种高级编程语言,广泛应用于嵌入式系统开发。这份教程共分为30...

    大虾网超好的串口调试工具-sscom5.04a.rar-大虾网超好的串口工具-sscom5.04a.rar

    SSCOM5.04a是该软件的一个版本,它提供了一系列强大的功能,帮助工程师们进行串口通信的测试、调试和数据传输。下面将详细介绍SSCOM5.04a的关键特性及其在实际应用中的价值。 首先,SSCOM5.04a支持多种串行接口标准...

    大虾们都来帮我整整Matlab的Sfunction问题急-theta.m

    大虾们都来帮我整整Matlab的Sfunction问题急-theta.m 在下是新手,遇到问题如下,请高手帮帮我

    JMSAP36-令狐大虾.docx

    【知识点】 在IT行业中,诚信和公正是非常重要的价值观,特别是在公务员队伍的管理中。公事员诚信档案的建立是一个关键举措,旨在提升公务员的工作责任感和公众信任度。以下是相关知识点的详细说明: ...

    大虾的不同做法.docx

    虽然文件的标题和描述提及的是“大虾的不同做法”,但基于你所要求的主题,我们可以从中提炼出一些与烹饪和食材处理相关的IT知识点。在美食制作过程中,数字化技术和信息技术的应用已经非常广泛,以下是一些可能的...

    天鹅、大虾和梭鱼.ppt

    天鹅、大虾和梭鱼.ppt

    大虾烧白菜简单好吃的做法.docx

    【大虾烧白菜】是一道深受人们喜爱的家常菜肴,它将鲜美的大虾与营养丰富的白菜结合,口感层次丰富,营养均衡。下面将详细讲解如何制作这道菜,以及挑选新鲜大虾的方法和技巧。 **大虾烧白菜的做法** 1. **准备...

    大虾电子网30章C51入门教程

    C51是为8051系列单片机设计的一种高级语言,它的语法接近于标准C,但加入了针对硬件特性的特定指令,使得程序编写更为简洁高效。 1. C51语言基础:C51是基于C语言的扩展,保留了C语言的基本结构,如变量定义、控制...

    C语言嵌入式编程的方方面面

    某个大虾给出的嵌入式编程修养,其中有许多发人深思的问题,讲的非常好。其中包含编程修养.doc,如何提高自己的编程水平.doc,(经典)C语言嵌入式系统编程修炼之屏幕操作篇(经典).doc,C语言嵌入式系统编程修炼之...

    JMSAP36--令狐大虾.docx

    从产业设计的角度来看,我们需要更加注重智能化和交互化的设计理念,通过技术创新提升产品的智能水平,满足人们对高质量生活的追求。而在粉丝文化领域,则需要社会各方面共同努力,引导其健康发展,发挥其积极作用,...

    unix C语言crontab、makefile资料

    【Unix C语言crontab、makefile资料】 在Unix操作系统中,C语言是核心的编程语言之一,而crontab和makefile则是开发者在日常工作中不可或缺的工具。这两个概念是Unix/Linux开发环境中效率和自动化的重要组成部分。 ...

    大虾炒年糕的做法.docx

    【大虾炒年糕】是一道深受江浙沪地区人们喜爱的传统美食,它结合了东北菜和韩国料理的特色,简单易学,烹饪时间仅需10分钟左右,适合忙碌的上班族快速制作。以下是对这道菜品的详细解析: **所需食材与调料:** - ...

    大虾电子网30章C51入门教程(C程序讲解)

    本教程“大虾电子网30章C51入门教程”是一个全面的学习资源,适合初学者和有一定基础的程序员,通过深入浅出的方式讲解C51的语法和应用。 在C51编程中,理解基本的C语言概念至关重要,包括变量、数据类型、运算符、...

    大虾串口助手sscom5.13.1

    一款非常好用的串口调试工具

    大虾的拼音怎么写.docx

    【大虾的拼音和汉字解析】 “大虾”这个词在汉语中的拼音是“dà xiā”。其中,“大”指的是尺寸或数量上的“大”,拼音为“dà”;“虾”则是指一种生活在水中的动物,属于甲壳纲,拼音为“xiā”。在中文里,...

    单片机教程(C51学习教程介绍)

    聂小猛,网名丁丁,国内著名的大虾电子网(http://www.daxia.com)创始人,1998年从广州中山大学物理系毕业,在广州一家从事寻呼基站业务的公司工作。99年跳到深圳华为,从事大型通信电源监控的设计工作,2000年回到...

Global site tag (gtag.js) - Google Analytics