需要考虑的问题都已在程序中注释

 bool isValid;

 int StrToInt(const char* str)
{
isValid = false;
//不合法情形1:空指针
if (str == NULL)
return ; //不合法情形2:内容为“”
if (*str == '\0')
return ; const char *pData = str;
bool isNegative = false;
if (*pData == '+')
{
isNegative = false; //是否是负数
pData++;
//不合法情形3:内容为+
if (*pData == '\0')
return ;
}
else if (*pData == '-')
{
isNegative = true;
pData++;
//不合法情形3:内容为-
if (*pData == '\0')
return ;
} long long num = ; //设为long long检查越界
while (*pData != '\0')
{
//不合法情形5:存在非数字
if (*pData < '' || *pData > '')
return ;
else
{
num = num * + (*pData - '');
}
pData++;
} //不合法情形6:越界
num = isNegative ? - num : num;
//注意一定要加(signed int)
if (isNegative && num < (signed int)0x80000000 || !isNegative && num > 0x7FFFFFFF)
return ; isValid = true;
return num;
}

带测试的完整代码:

 #include<iostream>
using namespace std; bool isValid; int StrToInt(const char* str)
{
isValid = false;
//不合法情形1:空指针
if (str == NULL)
return ; //不合法情形2:内容为“”
if (*str == '\0')
return ; const char *pData = str;
bool isNegative = false;
if (*pData == '+')
{
isNegative = false; //是否是负数
pData++;
//不合法情形3:内容为+
if (*pData == '\0')
return ;
}
else if (*pData == '-')
{
isNegative = true;
pData++;
//不合法情形3:内容为-
if (*pData == '\0')
return ;
} long long num = ; //设为long long检查越界
while (*pData != '\0')
{
//不合法情形5:存在非数字
if (*pData < '' || *pData > '')
return ;
else
{
num = num * + (*pData - '');
}
pData++;
} //不合法情形6:越界
num = isNegative ? - num : num;
//注意一定要加(signed int)
if (isNegative && num < (signed int)0x80000000 || !isNegative && num > 0x7FFFFFFF)
return ; 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(""); 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 ;
}

itoa实现,最后别忘加='\0'

 void itoa(int num, char *str)
{
int power = ;
int j = num; while (j / != )
{
power *= ;
j /= ;
} while (num != )
{
*str++ = '' + (num / power);
num %= power;
power /= ;
}
*str = '\0';
}

面试题49:把字符串转换成整数(atoi)的更多相关文章

  1. [LeetCode]面试题67. 把字符串转换成整数

    题目 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们 ...

  2. 《剑指offer》面试题67. 把字符串转换成整数

    问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数.   首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...

  3. 17.把字符串转换成整数[atoi]

    [题目] 把字符串转换成整数,需要考虑字符串有效性. [代码]  C++ Code  123456789101112131415161718192021222324252627282930313233 ...

  4. 剑指Offer 49. 把字符串转换成整数 (字符串)

    题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一 ...

  5. [剑指Offer] 49.把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0  [思路]考虑所有特殊情况 1.数字前面有空格,如s="    12 ...

  6. 【剑指Offer学习】【面试题49:把字符串转换成整数】

    题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能.不能使用atoi或者其它相似的库函数. 题目解析 这看起来是非常easy的题目,实现基本功能 ,大部分人都能用10行之内的代码 ...

  7. 《剑指offer》第六十七题(把字符串转换成整数)

    // 面试题67:把字符串转换成整数 // 题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能.当然,不 // 能使用atoi或者其他类似的库函数. #include <ios ...

  8. Java将ip字符串转换成整数的代码

    下面代码是关于Java将ip字符串转换成整数的代码,希望对各位有较大用途. public class IpUtil { public static int Ip2Int(String strIp){ ...

  9. 【Java】 剑指offer(67) 把字符串转换成整数

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请你写一个函数StrToInt,实现把字符串转换成整数这个功能 ...

  10. Python使用函数实现把字符串转换成整数

    需求:假设Python没有提供内置函数int如果使用函数方式实现把一串字符串转换成整数例如把字符串‘12345‘转换成整数12345 思路 1,字符串也是序列可以使用map函数处理分割成一个列表 2, ...

随机推荐

  1. 对faster rcnn 中rpn层的理解

    1.介绍 图为faster rcnn的rpn层,接自conv5-3 图为faster rcnn 论文中关于RPN层的结构示意图 2 关于anchor: 一般是在最末层的 feature map 上再用 ...

  2. python中的协程并发

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

  3. Shell记录-Shell命令(find)

    Linux中的find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花 ...

  4. PHP常亮

    define('PI','3.14'); echo PI; 名字大写,创建后不能修改和销毁 销毁变量用unset()

  5. bzoj千题计划161:bzoj1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

    http://www.lydsy.com/JudgeOnline/problem.php?id=1589 tarjan缩环后拓扑排序上DP #include<cstdio> #includ ...

  6. bzoj千题计划119:bzoj1029: [JSOI2007]建筑抢修

    http://www.lydsy.com/JudgeOnline/problem.php?id=1029 把任务按截止时间从小到大排序 如果当前时间+当前任务耗时<=当前任务截止时间,把这个任务 ...

  7. 翻译:GLSL的顶点位移贴图

    翻译:GLSL的顶点位移贴图 翻译自: Vertex Displacement Mapping using GLSL 译者: FreeBlues 说明: 之所以选择这篇文档, 是因为现在但凡提到位移贴 ...

  8. activity 中获取控件的宽高

    1.第一种方式: TextView textview3 = findViewById(R.id.textview3); textView3.post(new Runnable() { @Overrid ...

  9. 用Grub4dos引导,硬盘安装ArchLinux

    本来在工作机上用winXP,最近想深入Linux开发,于是决定装个Linux.家里的archLinux + awesome用得很好, 于是决定在工作机上也装一套. 不想刻盘,也不想用U盘,通过Grub ...

  10. java保存json格式数据,保存字符串和读取字符串

    1.java保存json格式数据,保存字符串和读取字符串 import java.io.*; class RWJson { public void wiite(String s, String toS ...