剑指offer-----将一个字符串转换成对应的整数(模拟atoi)
2016-05-22 00:33
344 查看
题目:给定字符串,将其转换成相应的整数。比如“12345”转换后就是12345.
当一看到题目,我就在纸上写了如下代码:
这段代码,这考虑的也太不周到了吧~~如果,字符串中出现了除了0~9以外的字符怎么办??直接想的太简单,所以
这是一段特别失败的代码。通过读《剑指offer》这本书结尾对这个知识的讲解,我整理出了以下:
入“123abc”,上边代码输出 0 字符串存在异常
其实这是与atoi本身不相同的,所以,将上述代码略做修改,当遇到非数字字符,就返回前边数字字符表示的数,所
以to_num函数中的else里的num = 0;那句应该去掉。下边我来简述程序的实现过程。
设置全局变量用来标记,如果是异常输入(包含非数字字符,非+-字符),这个表示置为1,否则是0.一开始进入
my_atoi函数,将这个标志设置为有异常(为1),如果之后发现字符串中的字符是数字字符或者+—,这个位置为
0,表示无异常。
程序还需要注意的是,数字表示的范围不能太大(32位系统,整形数4字节,有符号数的话,一位表示符号),所以
正数的范围不能超过0x7FFFFFFF,负数的范围不能超过有符号数的0x80000000,这个需要注意。
其实,程序一开始的枚举也是可以不要的,下边只要自行置数就好。
一定要细心,写代码之前一定要考虑全面~希望自己可以做得更好~~
当一看到题目,我就在纸上写了如下代码:
int my_atoi(const char *str) { assert(str); int i = 0; int flag = 1; int num = 0; while (*str) { if (*str == '+') { flag = 1; str++; } else if (*str == '-') { flag = -1; str++; } if(*str >= '0' && *str <= '9') { num = num * 10 + flag * (*str - '0'); str++; } } return num; } int main() { char *str = "12345"; int num = my_atoi(str); printf("%d",num); system("pause"); return 0; }
这段代码,这考虑的也太不周到了吧~~如果,字符串中出现了除了0~9以外的字符怎么办??直接想的太简单,所以
这是一段特别失败的代码。通过读《剑指offer》这本书结尾对这个知识的讲解,我整理出了以下:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> enum Status { kvalid, kinvalid }; int flag = kvalid;//定义全局变量,标志字符串是否是异常 long long to_num(const char *str, int s) { long long num = 0; while (*str) { if (*str >= '0' &&*str <= '9') { num = num * 10 + s * (*str - '0'); //是否溢出的判断 if ((s == 1 && (num > 0x7FFFFFFF)) || (s == -1) && (num < (signed int)0x80000000)) { num = 0; break; } str++; } else { num = 0; break; } } if (*str == '\0') flag = kvalid;//字符串不是异常 return num; } int my_atoi(const char *str) { flag = 1; long long num = 0; if (str != NULL && *str != '\0') { int s = 1;//定义符号位 if (*str == '+') str++; else if(*str == '-') { str++; s = -1; } if (*str != '\0') { num = to_num(str, s); } } return (int)num; } int main() { char *str = ""; int num = my_atoi(str); printf("%d\n",num); if (flag == 0) { printf("字符串没有异常"); } if (flag == 1) { printf("字符串存在异常"); } system("pause"); return 0; }这段代码考虑到整形数的范围,也考虑到其他字符的处理办法,而上边的代码并没有真正做到模拟atoi,比如输
入“123abc”,上边代码输出 0 字符串存在异常
其实这是与atoi本身不相同的,所以,将上述代码略做修改,当遇到非数字字符,就返回前边数字字符表示的数,所
以to_num函数中的else里的num = 0;那句应该去掉。下边我来简述程序的实现过程。
设置全局变量用来标记,如果是异常输入(包含非数字字符,非+-字符),这个表示置为1,否则是0.一开始进入
my_atoi函数,将这个标志设置为有异常(为1),如果之后发现字符串中的字符是数字字符或者+—,这个位置为
0,表示无异常。
程序还需要注意的是,数字表示的范围不能太大(32位系统,整形数4字节,有符号数的话,一位表示符号),所以
正数的范围不能超过0x7FFFFFFF,负数的范围不能超过有符号数的0x80000000,这个需要注意。
其实,程序一开始的枚举也是可以不要的,下边只要自行置数就好。
一定要细心,写代码之前一定要考虑全面~希望自己可以做得更好~~
相关文章推荐
- JavaScript DOM用document.createElement()生成元素,用seAttribute()函数设置属性值
- JavaScript DOM用document.createElement()生成元素,用seAttribute()函数设置属性值
- JavaScript DOM用document.createElement()生成元素,用seAttribute()函数设置属性值
- JavaScript DOM用document.createElement()生成元素,用seAttribute()函数设置属性值
- jstorm源码分析:任务领取
- 封装类似jQuery的ajax函数
- javascript模拟实现Map
- javascript去掉数组重复项
- javascript其他引用类型对象
- javascript原型和多维数组遍历
- javascript继承实现
- css选择器-属性选择器
- javascript函数的3种定义方式
- javascript数组操作
- HTML- css多列布局
- javascript之块级作用域的概念和闭包
- javascript接口鸭式辨型法实现
- 在ie8上js实现简单的combobox功能(支持拼音检索)
- javascript之arguments对象
- javascript数组的其他方法