整型与字符串的相互转化
By 呆龙
常用到的整形与字符串相互转化多用到库函数:
atoi/itoa/sprintf等
下面是不用库函数自己实现整形转化为字符串
整型数据456转化字符“456”输出
首先回顾一下ASCII的知识:
ASCII(American Standarded Code for Information Interchange美国标准信息交换码):用一个字节的除最高位外的七位表示字符,共可表示128种字符的字符集:
其中:第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;48~57表示阿拉伯数字;65~90表示英文大写字母;97~122表示英文小写字母,
字符 编码的十进制
0 48
1 48+1
2 48+2
…
x 48+x
…
9 48+9
由上可以看出,任意一个整数将其每一位加上48即可得到相应字符的ASCII编码
{
int m = 456;
int i = 0;
int str_0[10] = {0};//缓存
str_0[1] = m/100 +48;
str_0[2] = (m%100)/10 + 48;
str_0[3] = m%10 + 48;
for (i = 0; i < 3; i++)
{
printf(“%c”, str_0[i]);
}
return 0;
}
缺点:①数据存于整型数组。
②转换不具备通用性。
针对第一点:根据字符与整型数据的一致性改动程序如下:
int main()
{
int m = 456;
int i = 0;
char str_0[10] = “”;//缓存
str_0[1] = m/100 + ‘0’;
str_0[2] = (m%100)/10 + ‘0’;
str_0[3] = m%10 + ‘0’;
cout << str_0 << endl;
return 0;
}
第二点:
且看这里
12…..x%10 = (12…..0 + x)%10 = x;
12…xy/10 = (12..x0 + y)/10 = 12…x;
也就是说:
m%10永远等于最后一位
m/10永远等于除最后一位前边所有位
这就给我们构造了一个循环的可能
while(m)
{
buf[i++] = m%10;
m = m/10;
}
这样就可以将整数的各个位逆序的存入缓存buf中等待进一步处理
代码如下:
void itoastr( int num, char *str)
{
char buf[80] = "";
int iCount = 0; //循环计数
char *p = buf;
char *q = p;
char *strTmp = str;
int temp = num < 0 ? -num:num;
//异常检测
if (!str)
{
return;
}
//如果整数为0,直接赋值返回
if (0 == temp)
{
*str = '0';
return;
}
//如果整数为负数,先做符号处理
else if (0 > num)
{
*(strTmp++) = '-';
}
//取得整数的各个位逆序存入缓存
while (temp)
{
buf[iCount++] = temp % 10;
q++;
temp = temp / 10;
}
//从缓存中取得各个位转换成字符正序存入字符数组
for (; q > p;)
{
*(strTmp++) = *(--q) + '0';
}
return;
}
int main()
{
int iNum = -123;
char str[10] = "";
(void)itoastr(iNum, str);
cout << str << endl;
return 0;
}
这样就完成了一个简单的整数向字符串转换函数