模拟实现atoi
思路:
atoi函数,实现字符串到数字的转换,例如,将“1111”转成数字就是1111,在转的时候我们可以定义一个指针,随着指针的后移,把字符串的每一个字符,依次转成数字,另外还需注意,负号和空格问题,在代码中都应该考虑到。
代码:
//模拟实现atoi
long my_atoi(char*p)
{
int flag = 1;
long number = 0;
while (*p == ' ')
{
p++;
}
if (*p == '-')
flag = -1;
p++;
while (*p >= '0'&&*p <= '9')
{
number = number * 10 + (*p) - '0';
p++;
}
return flag*number;
}
int main()
{
char s[] = "-123456789";
long ret = my_atoi(s);
printf("%ld", ret);
system("pause");
return 0;
}
运行结果:
看到这里,我认为自己已经完成了,但是,如果其中有特殊字符呢?
显然代码还少了字符串中的特殊字符要怎么处理,于是把代码进行改进
while (*p)
{
if (*p<'0' || *p>'9')
{
p++;
}
if (*p >= '0'&&*p <= '9')
{
number = number * 10 + (*p) - '0';
p++;
}
}
再次测试:
模拟实现itoa
思路:
itoa函数,实现数字到字符串的转换,例如,将1111转成数字就是“1111”。但是在转的时候,由于用到求余取模运算,所以出来的字符串需要翻转一下,当然象1111这种不明显,但是象6789,求余取模后是“9876”需要在写个函数字符串进行翻转。
void reserveS(char* start,char* end)
{
//char *p = start;
if (start == NULL || end == NULL)//注意这一步不能省
return ;
while (start<end)
{
swap(*start,*end);
start++;
end--;
}
}
char* my_itoa1( long int b,char*s)
{
long int c = b;
int i = 0;
if (c < 0)
{
c = -c;
}
do
{
s[i++] = c % 10 + '0';
c = c / 10;
} while (c>0);
if (b < 0)
{
s[i++] = '-';
}
s[i] = '\0';
reserveS(s,s+i-1);
return s;
}
int main()
{
long int a =123456789;
char s[100];
printf("%s", my_itoa1(a,s));
system("pause");
return 0;
}
总结:
在模拟实现这两个函数时候要特别注意一些细微的事情,比如说字符串要不要翻转,指针为空的判断,所输入的字符串是否含有特殊字符,是不是还要特殊处理一下;另外,你所定义的变量是局部变量还是全局变量,如果是局部变量,出了函数就把该变量销毁了,如果还想用这个局部变量带回一个值,这显然会让程序崩溃。