一、atoi函数是什么?
int atoi ( const char * str );
功能:将字符串转换为整数。 解析C字符串str,将其内容解释为一个整数,该整数作为int值返回。
该函数首先丢弃尽可能多的空白字符,直到找到第一个非空白字符。然后,从这个字符开始,取一个可选的初始加号或减号,后面跟着尽可能多的数字,并将它们解释为一个数值。 例:" -123456" 转换为 -123456
字符串可以在构成整数的字符之后包含其他字符,这些字符将被忽略,并且对该函数的行为没有影响。例:" 123abc456" 转换为 123,虽然最终的输出结果是一个整数,但这属于非法转换
如果str中的第一个非空白字符序列不是有效的整数,或者由于str为空或只包含空白字符而不存在这样的序列,则不执行转换。例:“abc” " abc" “” 为非法转换,最终会输出整数0。
字符串 | 整数 | 合法性 |
---|
" 123456" | 123456 | 合法 | “-123456” | -123456 | 合法 | “123abc456” | 123 | 非法 | “abc” | 0 | 非法 | “” | 0 | 非法 | “2222222222” | 任意值 | 非法 |
注:当转换的值超出int可表示值的范围时会发生什么,没有标准规范。 例:在VS2013编译环境下输出的数值
二、atoi函数模拟实现
#include <stdio.h>
#include <limits.h>
#include <ctype.h>
enum Status
{
VALID,
INVALID
};
enum Status status = INVALID;
int my_atoi(const char* str)
{
if (str == NULL)
{
return 0;
}
if (*str == '\0')
{
return 0;
}
while (isspace(*str))
{
str++;
}
int flag = 1;
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
long long ret = 0;
while (isdigit(*str))
{
ret = ret * 10 + flag*(*str - '0');
if (ret<INT_MIN || ret>INT_MAX)
{
return 0;
}
str++;
}
if (*str == '\0')
{
status = VALID;
return (int)ret;
}
else
{
return (int)ret;
}
}
int main()
{
int ret = my_atoi(" -2222222222");
if (status == VALID)
{
printf("合法的转换:%d\n", ret);
}
else
printf("转换不合法!返回值为:%d\n",ret);
return 0;
}
总结
基本上该函数的模拟实现要注意的细节都在上面的代码注释里。
还要再解释的是为什么要将返回值定义成 long long 长整型,而不是stoi函数的返回值 int 型呢?
这是因为在计算求和的时候万一出现越界,由于之前将返回值定义为 int 型,这时就会将已经越界的数字强制转换为非越界的数字,那么就会导致错误的输出结果和错误的合法性判断。
|