今天去一家公司面试,CTO要求我编一个程序看看 ,题目是:不用C语言库函数实现整数转换为字符串。
开始想到的只是用对10取余数来获取该整数所包含的一个个数字。不过这种方法有一个缺点,就是得到的字符串是反的,也就是先是低位数字、然后才是高位的数字。又仔细想了想,发现可以用递归来实现,回来后用lcc编译运行发现没有问题。用递归实现整数到字符串转换,代码比较清晰易懂,函数也比较简单。优化后的源代码如下:
#include <stdio.h>
#define MAX_LEN 15 /* 最大位数 */
/* 转换时用到的递归函数 */
char *trans_int(int num,char *str)
{
int node_num,digit;
char *ptr;
if(num < 10) /* 只剩个位 */
{
*str=num + '0'; /* 数字转换为对应的ascii代码 */
return str;
}
else
{
node_num = num / 10;
ptr=trans_int(node_num,str); /*递归调用*/
digit = num - node_num * 10;
ptr++;
*ptr = digit + '0';
return ptr;
}
}
/* 转换函数 */
char * itoa(int num)
{
static char str[MAX_LEN+1];
int positive_num;
char *ptr;
ptr = str;
if(num >= 0)
{
ptr=trans_int(num,str);
}
else /* 处理负数 */
{
*(ptr++) = '-';
positive_num = num * -1; /* transform to positive integer */
ptr=trans_int(positive_num,ptr);
}
ptr++;
*ptr='/0';
return str;
}
/* 测试用main函数 */
void main()
{
int n;
printf("Input a integer:");
scanf("%d",&n);
printf("The integer %d to string result is : '%s'/n",n,itoa(n));
}
开始想到的只是用对10取余数来获取该整数所包含的一个个数字。不过这种方法有一个缺点,就是得到的字符串是反的,也就是先是低位数字、然后才是高位的数字。又仔细想了想,发现可以用递归来实现,回来后用lcc编译运行发现没有问题。用递归实现整数到字符串转换,代码比较清晰易懂,函数也比较简单。优化后的源代码如下:
#include <stdio.h>
#define MAX_LEN 15 /* 最大位数 */
/* 转换时用到的递归函数 */
char *trans_int(int num,char *str)
{
int node_num,digit;
char *ptr;
if(num < 10) /* 只剩个位 */
{
*str=num + '0'; /* 数字转换为对应的ascii代码 */
return str;
}
else
{
node_num = num / 10;
ptr=trans_int(node_num,str); /*递归调用*/
digit = num - node_num * 10;
ptr++;
*ptr = digit + '0';
return ptr;
}
}
/* 转换函数 */
char * itoa(int num)
{
static char str[MAX_LEN+1];
int positive_num;
char *ptr;
ptr = str;
if(num >= 0)
{
ptr=trans_int(num,str);
}
else /* 处理负数 */
{
*(ptr++) = '-';
positive_num = num * -1; /* transform to positive integer */
ptr=trans_int(positive_num,ptr);
}
ptr++;
*ptr='/0';
return str;
}
/* 测试用main函数 */
void main()
{
int n;
printf("Input a integer:");
scanf("%d",&n);
printf("The integer %d to string result is : '%s'/n",n,itoa(n));
}