整型数转二进制,八进制,十进制,十六进制字符串及浮点数转字符串Demo

概述:

    这次主要是一个整数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;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/Dancer__Sky/article/details/82284721
今日推荐