------------------------------------------
本文为本人原创,欢迎转载!
雪夜流星
------------------------------------------
atoi库函数的功能是把给定的字符串转换成整数,需要对无效的字符(除符号位和0-9的其他字符为无效字符),溢出处理(当溢出时,返回能够表达的上一次的值),对符号位进行处理。下面是代码实现:
- #include <stdlib.h>
- #include <stdio.h>
- int my_atoi(char *s)
- {
- char *tmp = NULL;//局部指针
- int sign = 1;//符号位标记,默认为正
- int t = 0;//用来保存上一次转换的值
- int sum = 0;//用来保存结果
-
- if (s==NULL)
- {
- return 0;
- }
- tmp = s;
- /*处理符号位*/
- switch(*tmp)
- {
- case '+':
- tmp++;
- break;
- case '-':
- sign = -1;
- break;
- default:
- break;
- }
- for ( ;*tmp;tmp++)
- {
- /*处理异常字符,如果字符串中有除0-9的字符,对该字符串不做任何处理*/
- if (*tmp < '0' || *tmp > '9')
- {
- return 0;
- }
- else
- {
- sum = 10*sum+(*tmp)-'0';
- /*处理异常,如果溢出则将上一次的值赋给sum*/
- if ((sum>>31) & 0x1 == 1)
- {
- sum =t;
- break;
- }
- t = sum;
- }
- }
-
-
- return sign*sum;
- }
- int main(void)
- {
- int i=0;
- printf("result[%d]:%d\n", i++, my_atoi("12345"));
- printf("result[%d]:%d\n", i++, my_atoi("12a45"));
- printf("result[%d]:%d\n", i++, my_atoi("-12345"));
- printf("result[%d]:%d\n", i++, my_atoi("abcde"));
- printf("result[%d]:%d\n", i++, my_atoi("123456789123456"));
-
- return 0;
- }
判断ip地址是否合法
合法的ip地址如192.168.1.1,ip地址合法的标准为:
1.不能出现除0-9和'.'之外的字符
2.不能过长
3.出现的'.'不能超过三个
4.每一段的数字部分必须在0-255之间
代码实现如下:
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #define MAX_LEN 255
- int ip_is_legal(char *s)
- {
- int start = 0;//记录需分割字符串的起始位置
- int end = 0; //记录当前字符串所遍历到字符的位置
- int count = 0;//记录字符串中‘.’出现的次数
- int i = 0;
- int t = 0;
- char *tmp = NULL;
- char a[4][MAX_LEN];
-
- memset(a, 0,sizeof(a));
-
- /*判空*/
- if(s == NULL)
- {
- return -1;
- }
-
- /*遍历整个字符串*/
- for(tmp = s;*tmp;tmp++)
- {
- if((*tmp < '0' || *tmp >'9') && *tmp !='.')
- {
- return -1;
- }
- if(*tmp == '.')
- {
- count++;
- /*每次遍历到字符串中的'.',计数count都加1,当'.'超过三个时为非法ip地址,做无效处理*/
- if(count > 3)
- {
- return -1;
- }
- /*标记start和end是针对整个字符串做的(静态的),在拷贝的时候也要用源字符串(静态的),
- 避免用用来遍历的临时指针tmp来作为拷贝的基准(动态的),拷贝完之后,在目的字符数组中
- 加上字符串结束符。在此记录一下,在此出现了一次失误,希望读者能够避免这个错误*/
- //memcpy(a[i], tmp+start, end-start);这一句是不能实现所求功能的
- memcpy(a[i], s+start, end-start);
- a[i][end-start] = '\0';
- i++;
- start=end+1;
- }
- end++;
- }
-
- memcpy(a[i], s+start, end-start);
- a[i][end-start] = '\0';
- /*将分割出来的四段字符串在循环外做判断,可以提高效率(以空间换时间,把最复杂的涉及
- 到乘法除法的部分提取出来),避免在上面的大循环中进行复杂的运算*/
- for(i=0; i<4; i++)
- {
- t = atoi(a[i]);
- if(t < 0 || t > 255)
- {
- return -1;
- }
- }
-
- return 0;
- }
- int main(void)
- {
- int i=0;
- printf("ip[%d]:%d\n", i++, ip_is_legal("192.168.1.1"));
- printf("ip[%d]:%d\n", i++, ip_is_legal("192.168.1.1.5"));
- printf("ip[%d]:%d\n", i++, ip_is_legal("192.168.277.1"));
- printf("ip[%d]:%d\n", i++, ip_is_legal("192.a.1.1"));
-
- return 0;
- }
阅读(3349) | 评论(0) | 转发(1) |