您的位置:首页 > 其它

自己实现itoa(),10进制到2~36进制的转换

2012-06-21 10:33 585 查看
先看下itoa()的函数说明:

功能:把一整数转换为字符串

用法:char *itoa(int value, char *string, int radix);

详细解释:itoa是integer to array(将int整型转化为一个字符串,并将值保存在数组string中)的缩写。

参数:value :待转化的整数。

radix:是基数的意思,即将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制。

*string:保存转换后得到的字符串。

返回值:char *:指向生成的字符串,同*string。

备注:该函数的头文件是“stdlib.h”(包含在iostream里面)

记住一点:itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。
是Windows平台下扩展的,标准库中有sprintf,功能比这个更强,用法跟printf类似。

备注:atoi()是标准库里面的函数,在C/C++语言参考函数里面有,而itoa()却没有,对此我们最好自己实现itoa()函数。

虽然可能itoa无法使用,但是我们可以编写自己的itoa()函数,以下是实现源代码:

//n是要被转换的十进制数,bit是要被转换的进制数
#include <iostream>
#include <string>
using namespace std;

char * Ten_to_other(int num,char* str, int radix)
{
const char a[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *ptr=str;
bool negtive = false;
if(num==0)
{
*ptr++=0;
*ptr='\0';
return NULL;//直接就退出,不走后面的情况了,不跟后面共用一个return语句。
}
if(num<0)
{
num *= -1;
*ptr++ ='-';
negtive = true;
}
while(num) //不能处理num=0的情况
{
*ptr++=a[num%radix];
num /= radix;
}
*ptr='\0';//此时ptr已经指向字符串结尾,而str仍旧指向字符串开始。
ptr--;//让ptr指向字符串内容!!
char *start=(negtive)? str+1:str;//注意此处不能写str++,否则,str不指向保存值的首地址了
while(start<ptr)
{
char tmp=*ptr;
*ptr=*start;
*start=tmp;
ptr--;
start++;
/*char tmp=*ptr--;//这样写ptr,str都加了那么多遍,肯定错了啊!!!
*ptr--=*str++;
*str++=tmp;*/
}
/*int len=strlen(str);
int i = (negtive)? 1:0;
for(i; i<len/2; ++i) //当为负数时候,str字符串最后的字符不能用len-1-i了,因为此时i=1而不是0
{
char tmp = str[i];
str[i]=str[len-1-i];
str[len-1-i]=tmp;
} */
return NULL;
}
int main()
{
char a[12]={0};
Ten_to_other(-82,a,6);
cout<<a<<endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: