【函数说明】
atoi()
函数会扫描参数 str 字符串,跳过
前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),
直到遇上数字或正负符号才开始做转换,而再遇到
非数字或字符串结束时(‘\0’)才结束转换
,并将结果返回。
【返回值】返回转换后的整型数
如果 str 不能
转换成 int 或者 str 为空字符串,那么将返回0
int my_atoi(const char* str)
{
assert(str);
char* pos1;//用于记录数字的最高位
char* pos2;//用于记录数字的最低位,pos2-pos1即可算出数字的位数
while (
( *str == ' ' ||
((*str) < '0' )||
((*str) > '9')
) && *str != '\0'
)
{
str++;
}
if (*str == '\0')//如果遇到str不能转换则返回0
{
return 0;
}
pos1 = str;
char* star = str;//此时的str(star)指向第一个数字字符
while (*str >= '0' && *str <= '9')
{
str++;
}
pos2 = str -1;//此时指向最后一位数
int len = pos2 - pos1 + 1;//计算数字的位数
int* pc = (int*)malloc(len * sizeof(int));
int i = 1;//我们这里就从1开始计数吧,0的位置不要了,不习惯
while ((*star) >= '0' && (*star) <= '9')
{
pc[i] = *star - 48;
star++;
i++;
}
//现在数组pc中存放的是所有的数字,len存放的是数字的位数,现在就把他们转换过来
int num = 0;
int ten = 1;
for (int j = len; j > 0; j--)
{
num += pc[j] * ten;
ten *= 10;
}
if (*(pos1 - 1) == '-')
{
return -num;
}
return num;
}
int main(void)
{
char str[] = " sd-s-sdsd";
int ret = my_atoi(str);
printf("%d\n",ret );
return 0;
}