这里强力推荐一篇文章?
详细解析了atoi函数以及其模拟实现,我这里就不说了。
这里作者先把自己模拟的代码给大家看一下。?
int add(char* arr)
{
char* arr2 = arr;
while (*arr!=-48)
{
arr++;
}
arr--;
int sum = 0;
int n = 0;
while (arr != (arr2-1))
{
sum += (*arr) * (int)pow(10, n);
n++;
arr--;
}
return sum;
}
void chage(char* arr)
{
int n = 0;
while (n < 100)
{
arr[n] -= 48;
n++;
}
}
int my_atoi(const char * str1)
{
if (!isdigit(*str1) && *str1 != ' ')
return 0;
while(*str1 == ' ')
{
str1++;
if (!isdigit(*str1) && *str1 !=' ')
return 0;
if (isdigit(*str1))
{
int n = 0;
char arr[100] = { 0 };
while (isdigit(*str1))
{
arr[n] = *str1;
str1++;
n++;
}
chage(arr);
return add(arr);
}
}
if (isdigit(*str1))
{
int n = 0;
char arr[100] = { 0 };
while (isdigit(*str1))
{
arr[n] = *str1;
str1++;
n++;
}
chage(arr);
return add(arr);
}
}
int main()
{
char a[] = "";
char b[] = " ";
char c[] = "66666";
char d[] = " @. 66ab";
char e[] = " 6666@qq.com";
char f[] = "5020hehe";
char g[] = "i love you 555";
printf("%d\n", my_atoi(a)); // 0
printf("%d\n", my_atoi(b)); // 0
printf("%d\n", my_atoi(c)); // 66666
printf("%d\n", my_atoi(d)); // 0
printf("%d\n", my_atoi(e)); // 6666
printf("%d\n", my_atoi(f)); // 5020
printf("%d\n", my_atoi(g)); // 0
return 0;
}
?
这里我模拟的代码实现了这个效果,但是比较复杂。所以给大家看下简洁版的代码,也就是那篇文章作者的代码。?
#include <stdio.h>
#include <assert.h>
// 数字ASCLL码值范围为 48—57
int my_atoi(const char* str)
{
assert(str);
const char* tmp = str;
while (*tmp == ' ') // 跳过空格字符
tmp++;
int num = 0; // 转换数字字符值的接收变量
// 如果是数字字符,就进来,到不连续处就停止
while (*tmp <= 57 && *tmp >= 48)
{
num = num * 10 + (*tmp - '0');
if (*(tmp + 1) < 48 || *(tmp + 1) > 57)
{
return num;
}
tmp++;
}
// 如果开始判断的字符不是数字字符,前面的循环不进去,这里直接返回0
return 0;
}
int main()
{
char a[] = "";
char b[] = " ";
char c[] = "66666";
char d[] = " @. 66ab";
char e[] = " 6666@qq.com";
char f[] = "520hehe";
char g[] = "i love you 555";
printf("%d\n", my_atoi(a)); // 0
printf("%d\n", my_atoi(b)); // 0
printf("%d\n", my_atoi(c)); // 66666
printf("%d\n", my_atoi(d)); // 0
printf("%d\n", my_atoi(e)); // 6666
printf("%d\n", my_atoi(f)); // 520
printf("%d\n", my_atoi(g)); // 0
return 0;
}
?相比我的代码,这个作者的更加简便且简洁易懂,更推荐这个代码。(建议大家去认真看下那篇文章讲的真的挺好)
?库函数atoi实现的效果跟我们模拟的一模一样
?
所以这就是atoi函数的模拟实现,其函数解析在另一篇文章里,强力推荐这篇文章。 (我这就不说了)