您的位置:首页 > 其它

模拟实现atoi和itoa函数

2017-08-09 17:43 337 查看
模拟实现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;

}



总结:

在模拟实现这两个函数时候要特别注意一些细微的事情,比如说字符串要不要翻转,指针为空的判断,所输入的字符串是否含有特殊字符,是不是还要特殊处理一下;另外,你所定义的变量是局部变量还是全局变量,如果是局部变量,出了函数就把该变量销毁了,如果还想用这个局部变量带回一个值,这显然会让程序崩溃。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: