atoi这个库函数实在的太强大了,很多细节上的处理是我们无法想象的,不过最近也尝试做了一下这个练习,发现真的不是那么简单,只实现了一部分功能。如将字符串”123”转换为123,”-0123”转换为-123。代码功能比较简陋,还有诸多没有实现的功能,相比库函数atoi还差的很多,仅供参考。

#include <stdio.h>
#include <stdlib.h>

int myatoi(char* buf)
{
// 备份一个文件指针
char* buf_back = buf;
// 记录返回值
int myint = 0;
// 记录首次出现数字字符的下标位置
int fast_int = 0;
// while循环中依次递增的索引
int idx = 0;
// 循环判断字符串是否走到了\0
while (*buf)
{
// 如果*buf的ASCII码在48~57之间
if (*buf >= 48 && *buf <= 57)
{
// 判断下标是否被记录过
if (fast_int == 0)
{
// 如果下标为0证明没有被记录过
// 那么记录下标为idx的值
fast_int = idx;
}
// 将myint的值与新*buf的值合并 sum = sum*10+(n-48)
myint = myint * 10 + (*buf - 48);
}
// 索引递增
idx++;
// 指针递增
buf++;
}
// 如果首次发现的下标大于0
if (fast_int > 0)
{
// 判断首次记录的下标的上一个下标对应的值是不是 “-“ 号的ASCII码
if (buf_back[fast_int - 1] == 45)
{
// 如果是则把myint值置为负数,就是*-1
myint *= -1;
}
}
// 返回myint的值
return myint;
}

int main(int argc, char* argv[])
{
printf(“%d\n”, myatoi(“25”));
printf(“%d\n”, myatoi(“-025”));
return 0;

}