【问题标题】:How to convert short to ASCII?如何将short转换为ASCII?
【发布时间】:2015-06-10 13:43:28
【问题描述】:

C 中将短数字转换为 ascii 的最佳方法是什么(通过速度优化)(-1,5,1000 到“-1”、“5”、“1000”) .

我需要它用于嵌入式 MCU,所以sprintf() 不是一个选项。

谢谢

【问题讨论】:

标签: c embedded converter


【解决方案1】:

作为@Potatoswatter简洁的cmets,使用标准itoa()就可以了。

至于什么是最快的:最好地描述候选解决方案。在一个平台上效果最好的方法在另一个平台上可能会有所不同。

以下是另一种实现。 Flowing 是一种紧密的递归解决方案,不需要反转其结果。它适用于所有int[INT_MIN, INT_MAX],因为它适用于int 的负侧,其大小与正侧相同或更大。

static char *itoa10_helper(int n, char *s) {
  if (n <= -10) {
    s = itoa10_helper(n / 10, s);
  }
  *s = (char) ('0' - n % 10);
  return ++s;
}

char* itoa10(int n, char *s) {
  if (n < 0) {
    *s = '-';
    *itoa10_helper(n, s+1) = 0;
  } else {
    *itoa10_helper(-n, s) = 0;
  }
  return s;
}

#include <limits.h>
#include <stdio.h>
#define INT_MAX_SIZE (sizeof (int)*CHAR_BIT/3 + 3)

int main(void) {
  char buf[INT_MAX_SIZE];
  puts(itoa10(0, buf));
  puts(itoa10(123, buf));
  puts(itoa10(INT_MAX, buf));
  puts(itoa10(INT_MIN, buf));
  return 0;
}

一个快速的解决方案,它在提供的缓冲区中返回一个指针somewhere,如下所示:

#include <stdbool.h>

char* itoa10f(int n, char *buf) {
  char *s = buf + INT_MAX_SIZE - 1;
  *s = '\0';
  bool isnegative = n < 0;
  if (!isnegative) {
    n = -n;
  }
  do {
    *(--s) = (char) ('0' - n % 10);
  } while (n /= 10);
  if (isnegative) {
    *(--s) = '-';
  }
  return s;
}

【讨论】:

  • 换句话说,使用itoa
  • itoa“标准”是什么标准?
  • @AnT itoa() 在过去几十年中常见于许多编译器中:Unix、Xenix、Kernighan 和 Ritchie、Borland/Turbo C 以及许多嵌入式平台,我从未将其视为C spec 中的标准功能,目前(如果有的话)在 Linux 中也不是。这很常见,因为 C 标准替代品 sprintf(buf, "%d", i) 在嵌入式平台中很昂贵。
  • CHAR_BIT的值是多少?
  • @user3428151 CHAR_BIT&lt;limits.h&gt; 中找到。通常是 8。#include &lt;limits.h&gt; #define INT_MAX_SIZE (sizeof (int)*CHAR_BIT/3 + 3) 不是为你编译的吗?你用的是什么编译器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多