面试笔试之atoi函数
来源:互联网 发布:域名备案系统 编辑:程序博客网 时间:2024/05/18 19:21
atoi函数: 假设我们不考虑进制问题,只考虑10进制
int atoi(char *str)
将字符串转换为int整数。需要考虑的问题:
- 字符串是不是不能为NULL? assert()
- 字符串开头部分有空白符(isspace())怎么办?
- 字符串中带符号位+-怎么办?
- 字符串转变过程中遇到非数字要直接返回当前值,怎么办?
- 如何转变?转变的方法是什么?*10+
- 溢出怎么办?
- 溢出有上溢和下溢之分?所以需要考虑int的范围
- 如果还要考虑8进制 16进制 2进制 10进制的问题的话,8进制以0开头,16进制以0x或者0X开头,10进制则没有,2进制的话。
实现代码是参考了http://www.wypblog.com/archives/224:
#include <stdio.h> #include <assert.h> #define MAX_INT ((1 << 31) - 1)#define MIN_INT (-(1 << 31)) int atoi(const char *str){ assert(str != NULL); char *temp = str; int i = 0; int flags = 0; unsigned int sum = 0; while(*temp == ' ' || *temp == '\t' || *temp == '\n') ++temp; // 下面这个判断貌似没有必须必要 if(*temp != '-' && *temp != '+' && (*temp < '0' || *temp > '9')){//第一个字符不是数字 return 0; } if(*temp == '-'){ //第一个是负号 flags = 1; ++temp; }else if(*temp == '+'){ ++temp; } while(*temp >= '0' && *temp <= '9'){ if(!flags){//上溢 if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '7'))){ return MAX_INT; } }else{//下溢 if(sum > MAX_INT / 10 || (sum == MAX_INT / 10 && (*temp > '8'))){ return MIN_INT; } } sum = sum * 10 + (*temp - '0'); ++temp; } return flags ? (-1 * sum) : sum;} int main(){ printf("%d\n", atoi("123")); return 0;}
说明:
反转部分写的稍显麻烦,应该利用--str和dst来进行反转的。
- 面试笔试之atoi函数
- 面试笔试之itoa函数
- 面试笔试之memcpy函数
- 面试笔试之strcmp函数
- linux函数之atoi
- 面试常考的atoi函数
- 笔试面试1 用C实现C库函数itoa, atoi
- Linux C之atoi()函数
- 笔试面试之反转字符串
- 笔试面试之奇偶partition
- 笔试面试之扑克牌顺子
- bakup之实习笔试面试
- 笔试面试之完全数
- 笔试面试之编程题
- 笔试面试之系统网络
- 扯淡篇 之 笔试面试
- 【逃离华为之面试、笔试】
- 面试笔试之Java集合
- Win8+Ubuntu12.04双系统安装(EasyBCD硬盘安装)
- libevent解析1--运行架构
- C# typeof() 和 GetType()区别
- poj 3117 World Cup
- opencv排错总结
- 面试笔试之atoi函数
- C语言各种数据类型在系统中占的字节和取值范围
- postgres源码解析篇1
- xp系统下更改PL2303 USB转串口线的COM端口号的方法
- 初识面向对象(成员变量和局部变量)
- Windows动态库管理(一)
- java中的成员变量和方法
- hdu 1175连连看
- 黑马程序员——异常