题目描述
编程实现字符串到整数的转换,例如输入字符串“123456”,输出整数12345
函数atoi
atoi 是把字符串转换成整型数的一个函数。包含在头文件stdlib.h中。
函数原型:
int atoi(const char *nptr);
参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。
函数分析
如果输入的字符包含不全是数字字符的字符。(例如:“123adc”.)
如果在数字字符前面有正负号又该怎么处理。( 例如:”-123”、“+123”.)
当输入的字符串前面几个字符都是空格怎么处理。(例如:“ 123”)
当输入的字符串中没有数字时,我们应该返回什么呢?返回0合适吗?
当字符串中的字符数字转化的整数太大,溢出问题怎么解决
怎么区分返回的是非法的0,还是字符串装换的0呢?所以我们可以设置一个全局变量state,来记录合法和非法返回
代码实现
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>
#include<limits.h>
enum State
{
VALUE,//合法状态
NOVALUE//非法状态
};
enum State state = NOVALUE;
int my_atoi(const char *str)
{
int flag = 1;//标识正负数的
long long ret = 0;
assert(str != NULL);
//空字符串,返回非法的0
if (*str == '\0')
{
return 0;
}
//前面如果是空白字符,跳过,isspace函数判断字符是否为空格,如果是返回非0,如果不是,返回0
while (isspace(*str))
{
str++;
}
if (*str == '+')
{
str++;
}
//处理负数
else if (*str == '-')
{
str++;
flag = -1;
}
while (*str)
{
//isdigit函数判断一个字符是否是数字,是返回非零,不是返回零
if (isdigit(*str))
{
ret = ret * 10 + (*str - '0')*flag;
//溢出问题
if (ret > INT_MAX || ret < INT_MIN)
{
return 0;
}
}
else
{
return (int)ret;
}
str++;
}
state = VALUE;
return (int)ret;
}
int main()
{
char *p = " -123a";
int ret=my_atoi(p);
if (state == VALUE)
{
printf("%d\n", ret);
}
else
{
printf("字符串非法,无法转换\n");
}
return 0;
}