atoi函数
#include<stdlib.h>
int main()
{
int atoi(const char* string);
return 0;
}
定义:将字符串转换为整数
头文件:<stdlib.h>
返回值:函数返回通过将输入字符转换为数字而产生的int值。
注:
- atoi不识别小数点或指数
- 如果输入不能转换为该类型的值,则返回值为0
- 在溢出的情况下,返回值未定义
- 函数将字符串转换为整型值(atoi)。输入字符串是可以被解释为指定类型的数值的字符序列。输出值受当前语言环境中LC_NUMERIC类别设置的影响
例:
#include<stdio.h>
#include<stdio.h>
int main()
{
char arr[20] = "1234"; //1.这里1234是字符 '1' '2' '3' '4' '\0'
//2.函数参数必须是可以被转换的数字字符
//3.函数遇到不可转换字符即停止,并且返回之前转换的字符
//例 arr[10] = "12a34 " ; 则返回 12
int ch = atoi(arr);
printf("%d\n", ch);
return 0;
}
手撕atoi函数
简单版本:这样写有一些条件,那就是字符串只能是数字字符,且不能为空。
那么如果说出现空指针,出现空字符串,出现空白字符,出现正负号,或者出现非数字字符和溢出怎么办?
接下来还有一个进阶版本,如下:
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<limits.h>
enum Status //设置返回状态
{
VALID, //合法
INVALID
}status = INVALID;//非法
int my_atoi(const char* str)
{
assert(str);//防止出现空指针
//1.出现字符串为空
if (*str == '\0')
{
return 0;//非法访问
}
//2.出现空白字符 isspace函数 :判断是否为空白字符
while (isspace(*str))
{
str++;//跳过空白字符
}
//3.出现 + -
int flag = 1; //标记 + - 状态
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
//4.出现非数字字符
long long n = 0; //防止被截断
while (*str != '\0')
{
if (isdigit(*str)) //isdigit函数:判断是否为数字字符
{
n = n * 10 + (*str - '0') * flag;
if (n < INT_MIN || n > INT_MAX) //判断是否越界
{
n = 0;
break;
}
}
else
{
break;
}
str++;
}
if (*str == '\0')
{
status = VALID;
}
return (int)n;
}
int main()
{
char arr[20] = "1234";
int ch = my_atoi(arr);
if (status == VALID)
{
printf("合法转换:%d\n", ch);
}
else
{
printf("非法转换:%d\n", ch);
}
return 0;
}