int atoi (const char * str);
//需要头文件<stdlib.h>
函数功能:
- 将字符串str转换成整数并返回
注意事项:
- 在转换过程中,如果在遇到数字字符之前遇到空白字符,则省略掉空白字符
- 如果在遇到数字字符之前遇到非数字字符,则停止转换,直接返回
- 如果返回的值超过int的最大值或最小值,返回INT_MAX或INT_MIN
int main()
{
char arr1[] = "123456";
char arr2[] = "-123456";
char arr3[] = " -123456";
char arr4[] = "-123abc456";
char arr5[] = "-abc123456";
char arr6[] = "abc";
char arr7[] = "";
char arr8[] = "1111111111111111111111111";
char arr9[] = "-1111111111111111111111111";
printf("%d\n", atoi(arr1));// 123456
printf("%d\n", atoi(arr2));// -123456
printf("%d\n", atoi(arr3));// -123456
printf("%d\n", atoi(arr4));// -123
printf("%d\n", atoi(arr5));// 0
printf("%d\n", atoi(arr6));// 0
printf("%d\n", atoi(arr7));// 0
printf("%d\n", atoi(arr8));// 2147483647(INT_MAX)
printf("%d\n", atoi(arr9));// -2147483647(INT_MIN)
return 0;
}
写代码时,我们要考虑周全,写出来的代码不仅仅是完成我们预期的结果,还要能处理各种异常情况
我们模拟实现的atoi函数要能够处理下面的情况:
- 空字符串,传过来的字符串没有值时,返回0
- 空白字符,跳过空白字符
- 正负号,有负号,返回也应当返回相应的负值
- 数据超过INT_MAX,直接返回INT_MAX;超过INT_MIN,直接返回INT_MIN
- 非数字字符,只转换数字字符
问题1:
有时候返回的值可能是正常的,也有可能是异常的,但和正常值在数值上是一样的;就比如空字符串,此时返回0,而atoi(“0”)也是返回0,那么0到底空字符串返回的异常值,还是转换后返回的正常值呢?这就产生了歧义
于是,我们定义一个枚举类型,并用该类型创建一个变量,默认值是异常值,如果atoi函数结束时,该变量是异常值,表示返回的值是异常的,否则是正常的
enum State
{
VALID,
INVALID
}state = INVALID;
问题2:
对于一个只有数字字符的字符串,怎么将该字符串转换成对应的整数?
”123456“—>123456:定义一个变量val,初始化为0,遍历字符串,将每一个字符减去’0’并和val相加,直到遍历完字符串,最后的值就是转换出来的值
enum State
{
VALID,
INVALID
}state = INVALID;
int my_atoi(const char* str)
{
assert(str);
state = INVALID;
//处理空字符串
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 val = 0;
while (*str)
{
if (isdigit(*str))
{
val = val * 10 + flag * (*str - '0');
if (val > INT_MAX || val < INT_MIN)
{
if (flag == 1)
return INT_MAX;
else
return INT_MIN;
}
str++;
}
else
{
return (int)val;
}
}
state = VALID;
return (int)val;
}
void ReturnVal(char arr[])
{
assert(arr);
int ret = my_atoi(arr);
if (state == VALID)
printf("正常返回:%d\n", ret);
else
printf("异常返回:%d\n", ret);
}
int main()
{
char arr1[] = "123456";
char arr2[] = "-123456";
char arr3[] = " -123456";
char arr4[] = "-123abc456";
char arr5[] = "-abc123456";
char arr6[] = "abc";
char arr7[] = "";
char arr8[] = "1111111111111111111111111";
char arr9[] = "-1111111111111111111111111";
ReturnVal(arr1);// 正常返回:123456
ReturnVal(arr2);// 正常返回:-123456
ReturnVal(arr3);// 正常返回:-123456
ReturnVal(arr4);// 异常返回:-123
ReturnVal(arr5);// 异常返回:0
ReturnVal(arr6);// 异常返回:0
ReturnVal(arr7);// 异常返回:0
ReturnVal(arr8);// 异常返回:2147483647
ReturnVal(arr9);// 异常返回:-2147483648
return 0;
}