概述:
这次主要是一个整数int转为各种进制字符串以及浮点数double转为字符串的操作。当然,前提条件是不可使用库函数sprintf,由于嵌入式开发环境,调用库后可能编译后的可执行文件过大,这里就是自己封装的一个简单转换的函数。留作笔记,以后也可直接使用,不用再找,麻烦。
Demo:
废话不多说,直接上源码,不过对于浮点数转换那里,由于精度问题,如果输入的浮点数精度超过我们的最大允许的精度,就可能会出现问题。如果你有更好的办法,希望也可以告知一二。(运行环境:Ubuntu14.04 64)
#include <stdio.h>
/*
功能:将int型数据转为2,8,10,16进制字符串
参数:value --- 输入的int整型数
str --- 存储转换的字符串
radix --- 进制类型选择
*/
char *sky_itoa(int value, char *str, unsigned int radix)
{
char list[] = "0123456789ABCDEF";
unsigned int tmp_value;
int i = 0, j, k = 0;
if (NULL == str) {
return NULL;
}
if (2 != radix && 8 != radix && 10 != radix && 16 != radix) {
return NULL;
}
if (radix == 10 && value < 0) {
//十进制且为负数
tmp_value = (unsigned int)(0 - value);
str[i++] = '-';
k = 1;
} else {
tmp_value = (unsigned int)value;
}
//数据转换为字符串,逆序存储
do {
str[i ++] = list[tmp_value%radix];
tmp_value /= radix;
} while(tmp_value);
str[i] = '\0';
//将逆序字符串转换为正序
char tmp;
for (j = k; j < (i+k)/2; j++) {
tmp = str[j];
str[j] = str[i-j-1+k];
str[i-j-1+k] = tmp;
}
return str;
}
/*
功能:将double型数据转为字符串
参数:value --- 输入的double浮点数
str --- 存储转换的字符串
eps --- 保留小数位选择,至少保留一个小数位,至多保留8个小数位
*/
void sky_ftoa(double value, char *str, unsigned int eps)
{
unsigned int integer;
double decimal;
char list[] = "0123456789";
int i = 0, j, k = 0;
//将整数及小数部分提取出来
if (value < 0) {
decimal = (double)(((int)value) - value);
integer = (unsigned int)(0 - value);
str[i ++] = '-';
k = 1;
} else {
integer = (unsigned int)(value);
decimal = (double)(value - integer);
}
//整数部分数据转换为字符串,逆序存储
do {
str[i ++] = list[integer%10];
integer /= 10;
} while(integer);
str[i] = '\0';
//将逆序字符串转换为正序
char tmp;
for (j = k; j < (i+k)/2; j++) {
tmp = str[j];
str[j] = str[i-j-1+k];
str[i-j-1+k] = tmp;
}
//处理小数部分
if (eps < 1 || eps > 8) {
eps = 6;
}
/*精度问题,防止输入1.2输出1.19等情况*/
double pp = 0.1;
for (j = 0; j <= eps; j++) {
pp *= 0.1;
}
decimal += pp;
/*小数转换为整数*/
while (eps) {
decimal *= 10;
eps --;
}
int tmp_decimal = (int)decimal;
str[i ++] = '.';
k = i;
//小数转换为整数的数据转换为字符串,逆序存储
do {
str[i ++] = list[tmp_decimal%10];
tmp_decimal /= 10;
} while(tmp_decimal);
str[i] = '\0';
//将逆序字符串转换为正序
for (j = k; j < (i+k)/2; j++) {
tmp = str[j];
str[j] = str[i-j-1+k];
str[i-j-1+k] = tmp;
}
}
int main()
{
char str[36] = {0};
//int转换为十进制字符串
sky_itoa(123456, str, 10);
printf("str = %s\r\n", str);
sky_itoa(-123456, str, 10);
printf("str = %s\r\n", str);
//int转换为十六进制及二进制字符串
sky_itoa(12, str, 16);
printf("str = %s\r\n", str);
sky_itoa(12, str, 2);
printf("str = %s\r\n", str);
sky_itoa(-12, str, 16);
printf("str = %s\r\n", str);
sky_itoa(-12, str, 2);
//浮点数转字符串
printf("str = %s\r\n", str);
sky_ftoa(-121.2345678, str, 6);
printf("str = %s\r\n", str);
sky_ftoa(121.2345678, str, 6);
printf("str = %s\r\n", str);
return 0;
}