模拟实现atoi和itoa函数

模拟实现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;
}


总结:

在模拟实现这两个函数时候要特别注意一些细微的事情,比如说字符串要不要翻转,指针为空的判断,所输入的字符串是否含有特殊字符,是不是还要特殊处理一下;另外,你所定义的变量是局部变量还是全局变量,如果是局部变量,出了函数就把该变量销毁了,如果还想用这个局部变量带回一个值,这显然会让程序崩溃。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值