您的位置:首页 > Web前端

剑指offer-----将一个字符串转换成对应的整数(模拟atoi)

2016-05-22 00:33 344 查看
题目:给定字符串,将其转换成相应的整数。比如“12345”转换后就是12345.

当一看到题目,我就在纸上写了如下代码:

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,这个需要注意。

其实,程序一开始的枚举也是可以不要的,下边只要自行置数就好。

一定要细心,写代码之前一定要考虑全面~希望自己可以做得更好~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: