C语言整数转字符串itoa

/*
整型数字转字符(包括负数) 
*/
#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;
}


猜你喜欢

转载自blog.csdn.net/qq1294272813/article/details/78032472