C语言实现int转换字符串的一种实现

在技术人员面试的时候,经常会被要求实现标准库的一些函数比如strlen,strcpy,itoa,atoi等等。本文就简单的聊聊一次面试的笔试题,作为一次失败面试的记录。

由于预先不知道整数的位数,一般在转字符串的时候,都是通过从个位开始往高位逐个转换。这样就会在转换完成以后,需要对生成的字符串进行逆序,才能达到最终结果。

本方案采取了一个小技巧,通过指针运算,字符拷贝(当然也可以直接通过内存考虑)方式,省略了最终的一个步骤:字符串逆序。

以下是具体的程序实现:

  1 #include <stdio.h>
  2 
  3 char* toString(int iVal)
  4 {
  5     /* 优化点:
  6      *  1,不通过堆栈的方式,无需进出栈,或者是对字符串进行逆序,直接通过指针运算,内存拷贝方式或者最终结果
  7      */ 
  8     char str[1024] = {'\0',};
  9     char *pos = NULL;
 10     int sign = 0;   //正数 或者是 0
 11 
 12     int abs = iVal;
 13 
 14     pos = str + 1023; //移动指针,指向堆栈底部
 15     *pos-- = '\0';  //end
 16 
 17     if(iVal < 0)
 18     {
 19         sign = 1;
 20         abs = -abs;
 21     }
 22     
 23     int dit = 0;
 24     while(abs > 0)
 25     {
 26         dit = abs % 10;
 27         abs = abs / 10;
 28 
 29         *pos-- = (char)('0' + dit); 
 30     }
 31 
 32     if(sign)
 33         *pos-- = '-';
 34 
 35     char *ret = (char*)malloc(1024 - (pos - str));
 36 
 37     if(iVal == 0)               //0的一个处理
 38         strcpy(ret, "0");
 39     else                        //iVal非0的拷贝
 40         strcpy(ret, pos+1);
 41 
 42     return(ret);    
 43 }
 44 
 45 int main(int argc, char* argv[])
 46 {
 47     char* ret = NULL;
 48 
 49     int iVal = atol(argv[1]);
 50 //  int iVal = 123456;
 51     printf("ival = %s\n", toString(iVal));
 52 
 53     return(0);
 54 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值