atoi函数解释:
函数原型:
int atoi (const char * str);
函数说明:
atoi函数返回值是整型;参数是一个常量字符串;
这个函数作用效果是将一个字符串转换为一个整型,返回的是这个转换之后整型的数值;
如果这个被操作的常量字符串开头是空字符,那么这个函数将自动跳过这些空字符只到第一个非空格字符被发现。接着从这个非空格字符开始往这个字符串后面操作,若是这个第一个非零字符是正负号,那么这个正负号将直接决定返回值的那个整型数值的正负;
若是这个字符串开头的不是空格或者不是数字字符,那么这个函数将直接返回零;
若是跳过空格以及识别正负号之后操作到非数字字符,那么也直接返回0;
若是在有效的数字字符串之间有非数字字符(无论是空格、正负号还是其他字符),这个函数将直接中断,将已经识别的数字字符转换成整型数值返回;
具体示例:
#include<stdio.h>
int main()
{
char str_1[] = " -123ab123";
char str_2[] = "abcd23 12";
char str_3[] = " +12 12";
char str_4[] = " +12ab12";
char str_5[] = "-123 12";
char str_6[] = "- 123abc0";
int reverse_num_1 = atoi(str_1);
int reverse_num_2= atoi(str_2);
int reverse_num_3 = atoi(str_3);
int reverse_num_4 = atoi(str_4);
int reverse_num_5 = atoi(str_5);
int reverse_num_6= atoi(str_6);
printf("字符串str_1转换之后返回的数字是:%d\n", reverse_num_1);
printf("字符串str_2转换之后返回的数字是:%d\n", reverse_num_2);
printf("字符串str_3转换之后返回的数字是:%d\n", reverse_num_3);
printf("字符串str_4转换之后返回的数字是:%d\n", reverse_num_4);
printf("字符串str_5转换之后返回的数字是:%d\n", reverse_num_5);
printf("字符串str_6转换之后返回的数字是:%d\n", reverse_num_6);
return 0;
}
函数atoi的模拟实现:
int my_atoi(const char* str)
{
while (isspace(*str))
{
str++; //isspace这个函数的参数如果是空格那么就为真
}
//此时字符串已经来到了第一个非空格字符
int flag = -1; //先立一个表示正负号的旗帜,方便后续记录正负
if (*str == '-')
{
flag = -1;
str++;
}
if (*str == '+')//不用else是因为此时我们判断的字符可能也不是正负号
{
flag = 1;
str++;
}//此时我们跳过了可以跳过的非数字字符
int ret = 0;
while (*str != '\0')//我们将进入操作数字字符的过程,而这个过程是要将整个字符串判断完的
{
if (isdigit(*str))//是数字字符就返回非零值,那么条件就为真
{
ret = ret * 10 + (*str - '0') * flag;//仔细研究并且带入一些数字字符串就会发现行代码适用
}
else
{
return ret;//只要碰见了非数字字符就返回
}
str++;
}
return ret;
}
int main()
{
char str[] = " -123abc123";
printf("%d\n", my_atoi(str));
return 0;
}
当字符串中返回的数值很大或者是很小的时候,我们可以把ret的类型变换为long long类型的,最后用if语句判断一下返回值若是超过了INT_MAX或者是小于INT_MIN那么就返回这个整型的最大值或者是最小值,当然返回的时候要把ret强制类型转换为int型的。