/*
整型数字转字符(包括负数)
*/
#include<stdio.h>
#include<stdlib.h>
/*
判断这个数字是几位数
*/
int num_length(int num)
{
int length=0;
if(num<0)
{
num*=-1;
while(num)
{
num=num/10;
length++;
}
return length+1;
}
else
{
while(num)
{
num=num/10;
length++;
}
return length;
}
}
/*
把数字进行拆分存入一个字符数组中
*/
char *itoa(int num)
{
int i,pos=0;
int length;
char *str = (char *)malloc(num_length(num)*sizeof(char)+1);
if(str==NULL)
{
printf("内存申请失败!");
}
length = num_length(num); //返回整型数字的位数
/* 1.0 这里遇到了一个问题,就是局部变量 str[length+1] (数组)
在函数结束时即使返回了数组的首地址,即使首地址有效,
但是里面的已经没有意义了,所以在主函数调用时,
输出的内容是乱码,定义成全局变量后解决了这个问题
statci 无法给长度会变化的数组变量进行修饰
2.0 经过测试使用malloc来进行内存的申请一段连续的内存,
然后将转换后的字符存入这个连续的内存中
*/
//算法:从高位到低位取数 除10取模从高地址到低地址存存到malloc开辟的内存中
pos=length;
*(str+pos)='\0'; //地址最高赋值\0,字符串的最后要加上\0
pos--;
if(num<0) //如果是负数
{
num*=-1; //*-1转换成正整数方便拆分
while(num)
{
*(str+pos)=(num%10)+'0'; //数字转成字符+'0'
num=num/10;
pos--;
}
*str='-'; //最低位,也就是起始地址赋值'负号 '
}
else
{
while(num)
{
*(str+pos)=(num%10)+'0'; //数字转成字符+'0'
num=num/10;
pos--;
}
}
return str;
}
int main(void)
{
int number=0;
char *p;
scanf("%d",&number);
printf("%s",itoa(number));
=pitoa(number);
free(p);//释放申请的内存空间
p=NULL; //指针赋值为NULL防止野指针的出现
return 0;
}
C语言整数转字符串itoa
最新推荐文章于 2024-07-11 16:31:22 发布