面试题49:把字符串转换成整数(atoi)
2016-07-21 16:54
316 查看
需要考虑的问题都已在程序中注释
带测试的完整代码:
View Code
itoa实现,最后别忘加='\0'
bool isValid; int StrToInt(const char* str) { isValid = false; //不合法情形1:空指针 if (str == NULL) return 0; //不合法情形2:内容为“” if (*str == '\0') return 0; const char *pData = str; bool isNegative = false; if (*pData == '+') { isNegative = false; //是否是负数 pData++; //不合法情形3:内容为+ if (*pData == '\0') return 0; } else if (*pData == '-') { isNegative = true; pData++; //不合法情形3:内容为- if (*pData == '\0') return 0; } long long num = 0; //设为long long检查越界 while (*pData != '\0') { //不合法情形5:存在非数字 if (*pData < '0' || *pData > '9') return 0; else { num = num * 10 + (*pData - '0'); } pData++; } //不合法情形6:越界 num = isNegative ? 0 - num : num; //注意一定要加(signed int) if (isNegative && num < (signed int)0x80000000 || !isNegative && num > 0x7FFFFFFF) return 0; isValid = true; return num; }
带测试的完整代码:
#include<iostream> using namespace std; bool isValid; int StrToInt(const char* str) { isValid = false; //不合法情形1:空指针 if (str == NULL) return 0; //不合法情形2:内容为“” if (*str == '\0') return 0; const char *pData = str; bool isNegative = false; if (*pData == '+') { isNegative = false; //是否是负数 pData++; //不合法情形3:内容为+ if (*pData == '\0') return 0; } else if (*pData == '-') { isNegative = true; pData++; //不合法情形3:内容为- if (*pData == '\0') return 0; } long long num = 0; //设为long long检查越界 while (*pData != '\0') { //不合法情形5:存在非数字 if (*pData < '0' || *pData > '9') return 0; else { num = num * 10 + (*pData - '0'); } pData++; } //不合法情形6:越界 num = isNegative ? 0 - num : num; //注意一定要加(signed int) if (isNegative && num < (signed int)0x80000000 || !isNegative && num > 0x7FFFFFFF) return 0; isValid = true; return num; } void Test(const char *testNum) { int result = StrToInt(testNum); if (testNum == NULL) { cout << "char * is Null" << endl; cout << "input is not vaild" << endl; cout << endl; return; } cout << "Test string is: " << testNum << endl; if (isValid) cout << result << endl; else cout << "input is not vaild" << endl; cout << endl; } int main() { Test(NULL); Test(""); Test("123"); Test("+123"); Test("-123"); Test("1a33"); Test("+0"); Test("-0"); Test("+"); Test("-"); //有效的最大正整数, 0x7FFFFFFF Test("+2147483647"); Test("-2147483647"); Test("+2147483648"); //有效的最小负整数, 0x80000000 Test("-2147483648"); Test("+2147483649"); Test("-2147483649"); system("pause"); return 0; }
View Code
itoa实现,最后别忘加='\0'
void itoa(int num, char *str) { int power = 1; int j = num; while (j / 10 != 0) { power *= 10; j /= 10; } while (num != 0) { *str++ = '0' + (num / power); num %= power; power /= 10; } *str = '\0'; }
相关文章推荐
- 互联网公司面试题库
- 机器学习面试材料
- 国内互联网公司算法&机器学习岗(阿里星)面试总结
- 想要惊艳面试官?你一张嘴就输了
- 几种查找数组的前K个最小值的算法
- 为什么越来越多人选择小而美的公司?
- 算法研究、编程艺术、红黑树、数据挖掘、程序员面试5大系列集锦
- git修改提交作者和邮箱
- 笑傲IT职场
- 黑马程序员:学生爆满很苦恼,暑期活动不能少!
- 情商面试题
- 哇,这就是传说中程序员的社区
- [置顶] java面试题
- [置顶] Android面试题【初级工程师版】
- 剑指0ffer面试题3:二维数组中的查找
- 关于java研发工程师面试相关的部分参考
- 10个值得深思的PHP面试问题
- 单链表面试题(二)从头到尾打印单链表
- teg技术规划架构师 0720 视频面试
- 单链表相关热点面试题(一)