模拟atoi函数,从字符串到数字的转化
2017-07-26 22:29
127 查看
atoi函数是将字符串转化为数字,这个函数可以面对任何错误的情况,是个强大的函数。今天我们就来模拟下它。
(1)考虑指针为空的情况
assert(str != NULL);
(2)考虑字符串为空的状况
if (*str == '\0')
{
return state;
}
state 是定义的一个全局变量,用来判断是否合法,首先赋值为不合法。
(3)考虑字符串前面是空白字符的情况,可以用isspace函数判断,(充分利用库函数)。
while (str&&isspace(*str))
{
str++;
}
(4)考虑是负数的情况
if (*str == '-')
{
flag = -flag;
str++;
}
flag的初始化为1,而-flag则为-1,相当于正负系数。
(5)考虑字符串前面是数字后面是其他字符的情况
else//非法字符
{
state = LEGAL;
return (int)ret;
}
这时截断后面的其他字符,返回计算的整型值。
(6)最后就是正常的情况了,数字字符
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}
}
else//非法字符
{
state = LEGAL;
return (int)ret;
}
该考虑的情况已经考虑完成,接下来就是整体的代码了
#include <ctype.h>
#include <limits.h>
#if 1
enum LEGAL
{
LEGAL,
ILLEGAL
};
enum LEGAL state = ILLEGAL;
int my_atoi(char *str)
{
int flag = 1;
long long ret = 0;
//指针为空
assert(str != NULL);
//空字符串
if (*str == '\0')
{
return state;
}
//空白字符
while (str&&isspace(*str))
{
str++;
}
//负数
if (*str == '-')
{
flag = -flag;
str++;
}
//数字
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}
}
else//非法字符
{
state = LEGAL;
return (int)ret;
}
str++;
}
state = LEGAL;
return (int) ret;
}
int main()
{
char str[] = "-12222222";
int ret = my_atoi(str);
if (state == LEGAL)
printf("%d", ret);
else
printf("不合法!");
getchar();
return 0;
}
好了,今天的代码完成了,加油!
(1)考虑指针为空的情况
assert(str != NULL);
(2)考虑字符串为空的状况
if (*str == '\0')
{
return state;
}
state 是定义的一个全局变量,用来判断是否合法,首先赋值为不合法。
(3)考虑字符串前面是空白字符的情况,可以用isspace函数判断,(充分利用库函数)。
while (str&&isspace(*str))
{
str++;
}
(4)考虑是负数的情况
if (*str == '-')
{
flag = -flag;
str++;
}
flag的初始化为1,而-flag则为-1,相当于正负系数。
(5)考虑字符串前面是数字后面是其他字符的情况
else//非法字符
{
state = LEGAL;
return (int)ret;
}
这时截断后面的其他字符,返回计算的整型值。
(6)最后就是正常的情况了,数字字符
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}
}
else//非法字符
{
state = LEGAL;
return (int)ret;
}
该考虑的情况已经考虑完成,接下来就是整体的代码了
#include <ctype.h>
#include <limits.h>
#if 1
enum LEGAL
{
LEGAL,
ILLEGAL
};
enum LEGAL state = ILLEGAL;
int my_atoi(char *str)
{
int flag = 1;
long long ret = 0;
//指针为空
assert(str != NULL);
//空字符串
if (*str == '\0')
{
return state;
}
//空白字符
while (str&&isspace(*str))
{
str++;
}
//负数
if (*str == '-')
{
flag = -flag;
str++;
}
//数字
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}
}
else//非法字符
{
state = LEGAL;
return (int)ret;
}
str++;
}
state = LEGAL;
return (int) ret;
}
int main()
{
char str[] = "-12222222";
int ret = my_atoi(str);
if (state == LEGAL)
printf("%d", ret);
else
printf("不合法!");
getchar();
return 0;
}
好了,今天的代码完成了,加油!
相关文章推荐
- 对于简单的将数字转化为字符串
- 字符串和数字之间的转化
- 字符数组,字符串、数字转化
- 将字符串转化为数字的python实现
- 将字符串转化成数字。
- 不用库函数,用c语言实现将一整型数字转化为字符串
- JavaScript中数字与字符串相互转化
- java中MessageFormat自动将数字转换成自定格式的字符串 如 45转化成 00045 同样可以转换时间
- C++字符串转化为数字的库函数
- C语言将数字转化为字符串
- 关于字符串中数字字符转化为数字 sscanf的使用以及strchr的使用
- 给定一个整数,把整数中包含的每一个数字放到一个数组中(不要把数字转化为字符串处理)
- 不用库函数,用C语言实现将一整型数字转化为字符串
- 面试题:字符串转化为数字
- 将字符串或者数字转化成英文格式输出
- 【C编程练习】2013华为校园招聘机试题目题5:将一个int类型的数字转化为字符串,并判断有无重复字符串(长度应大于2)有返回1,无返回2
- Java实现数字转化成字符串左边自动补零方法(流水号)
- 数字转化为字符串的库函数
- java中将16进制字符串转化为10进制数字。
- 【学习笔记】关于数字转化为字符串,字符串转化为数组。