Chinaunix首页 | 论坛 | 博客
  • 博客访问: 458465
  • 博文数量: 68
  • 博客积分: 2606
  • 博客等级: 上尉
  • 技术积分: 1308
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 23:01
文章分类
文章存档

2012年(6)

2011年(62)

分类: C/C++

2011-10-20 20:17:28

------------------------------------------
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
atoi库函数的功能是把给定的字符串转换成整数,需要对无效的字符(除符号位和0-9的其他字符为无效字符),溢出处理(当溢出时,返回能够表达的上一次的值),对符号位进行处理。下面是代码实现:
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. int my_atoi(char *s)
  4. {
  5.     char *tmp = NULL;//局部指针
  6.     int sign = 1;//符号位标记,默认为正
  7.     int t = 0;//用来保存上一次转换的值
  8.     int sum = 0;//用来保存结果
  9.     
  10.     if (s==NULL)
  11.     {
  12.         return 0;
  13.     }
  14.     tmp = s;

  15.     /*处理符号位*/
  16.     switch(*tmp)
  17.     {
  18.         case '+':
  19.             tmp++;
  20.             break;
  21.         case '-':
  22.             sign = -1;
  23.             break;
  24.         default:
  25.             break;
  26.     }
  27.     for ( ;*tmp;tmp++)
  28.     {    
  29.         /*处理异常字符,如果字符串中有除0-9的字符,对该字符串不做任何处理*/
  30.         if (*tmp < '0' || *tmp > '9')
  31.         {
  32.             return 0;
  33.         }
  34.         else
  35.         {
  36.             sum = 10*sum+(*tmp)-'0';
  37.             /*处理异常,如果溢出则将上一次的值赋给sum*/
  38.             if ((sum>>31) & 0x1 == 1)
  39.             {                
  40.                 sum =t;
  41.                 break;
  42.             }
  43.             t = sum;
  44.         }
  45.     }
  46.     
  47.     
  48.     return sign*sum;
  49. }

  50. int main(void)
  51. {
  52.     int i=0;

  53.     printf("result[%d]:%d\n", i++, my_atoi("12345"));
  54.     printf("result[%d]:%d\n", i++, my_atoi("12a45"));
  55.     printf("result[%d]:%d\n", i++, my_atoi("-12345"));
  56.     printf("result[%d]:%d\n", i++, my_atoi("abcde"));
  57.     printf("result[%d]:%d\n", i++, my_atoi("123456789123456"));
  58.     
  59.     return 0;
  60. }
判断ip地址是否合法
合法的ip地址如192.168.1.1,ip地址合法的标准为:
1.不能出现除0-9和'.'之外的字符
2.不能过长
3.出现的'.'不能超过三个
4.每一段的数字部分必须在0-255之间
代码实现如下:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>

  4. #define MAX_LEN 255

  5. int ip_is_legal(char *s)
  6. {    
  7.     int start = 0;//记录需分割字符串的起始位置
  8.     int end = 0; //记录当前字符串所遍历到字符的位置
  9.     int count = 0;//记录字符串中‘.’出现的次数
  10.     int i = 0;
  11.     int t = 0;
  12.     char *tmp = NULL;    
  13.     char a[4][MAX_LEN];
  14.     
  15.     memset(a, 0,sizeof(a));
  16.     
  17.     /*判空*/
  18.     if(s == NULL)
  19.     {
  20.         return -1;
  21.     }
  22.     
  23.     /*遍历整个字符串*/
  24.     for(tmp = s;*tmp;tmp++)
  25.     {    
  26.         if((*tmp < '0' || *tmp >'9') && *tmp !='.')
  27.         {
  28.             return -1;
  29.         }
  30.         if(*tmp == '.')
  31.         {    
  32.             count++;
  33.             /*每次遍历到字符串中的'.',计数count都加1,当'.'超过三个时为非法ip地址,做无效处理*/
  34.             if(count > 3)
  35.             {
  36.                 return -1;
  37.             }
  38.             /*标记start和end是针对整个字符串做的(静态的),在拷贝的时候也要用源字符串(静态的),
  39.               避免用用来遍历的临时指针tmp来作为拷贝的基准(动态的),拷贝完之后,在目的字符数组中
  40.               加上字符串结束符。在此记录一下,在此出现了一次失误,希望读者能够避免这个错误*/
  41.             //memcpy(a[i], tmp+start, end-start);这一句是不能实现所求功能的
  42.             memcpy(a[i], s+start, end-start);
  43.             a[i][end-start] = '\0';            
  44.             i++;
  45.             start=end+1;            
  46.         }
  47.         end++;
  48.     }
  49.     
  50.     memcpy(a[i], s+start, end-start);
  51.     a[i][end-start] = '\0';

  52.     /*将分割出来的四段字符串在循环外做判断,可以提高效率(以空间换时间,把最复杂的涉及
  53.      到乘法除法的部分提取出来),避免在上面的大循环中进行复杂的运算*/
  54.     for(i=0; i<4; i++)
  55.     {    
  56.         t = atoi(a[i]);        
  57.         if(t < 0 || t > 255)
  58.         {
  59.             return -1;
  60.         }
  61.     }
  62.     
  63.     return 0;
  64. }


  65. int main(void)
  66. {    
  67.     int i=0;
  68.     printf("ip[%d]:%d\n", i++, ip_is_legal("192.168.1.1"));
  69.     printf("ip[%d]:%d\n", i++, ip_is_legal("192.168.1.1.5"));
  70.     printf("ip[%d]:%d\n", i++, ip_is_legal("192.168.277.1"));
  71.     printf("ip[%d]:%d\n", i++, ip_is_legal("192.a.1.1"));
  72.     
  73.     return 0;
  74. }
阅读(3303) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~