如何将int转换为一系列字符

时间:2011-07-14 01:23:19

标签: c integer ascii character pic

我正在尝试将8位微控制器(PIC)上的C整数分解为ASCII等效字符。

例如: 将982转换为'9','8','2'

到目前为止我提出的所有内容似乎都非常强大。这是我现在基本上做的主要想法:

if( (10 <= n) && (n < 100) ) {
// isolate and update the first order of magnitude
digit_0 = (n % 10);
// isolate and update the second order of magnitude
switch( n - (n % 10) ) {
  case 0:
    digit_1 = 0;
    break;
  case 10:
    digit_1 = 1;
    break;

...

然后我有另一个函数只为我的每个数字添加0b00110000(48decimal)。

我一直无法找到任何C函数来为我做这件事或自己做得很好。

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

如果sprintf由于某种原因不合适,那么像这样的简单方法就可以了:

char digits[MAX_DIGITS];
int count = 0;
do {
    digits[count++] = n % 10;
    n /= 10;
} while (n > 0);

会有count个数字,digits[0]是最不重要的数字。

答案 1 :(得分:1)

要自己动手,您需要执行以下示例代码演示的操作:

#include <stdio.h>

int main (void)
{
  unsigned int x = 512;
  int base_val = 10, digit, i = 0, n = 0;
  char x_str[32], t;

  printf ("\nEnter an unsigned number: ");
  scanf ("%u", &x);

  printf ("\nEnter base: ");
  scanf ("%d", &base_val);

  /* Chop the digits in reverse order and store in `x_arr`
   * the interpretation of the digits are made in base value
   * denoted by `base_val`
   */

  while (x)
  {
    digit = x % base_val;
    x /= base_val;
    if (digit < 10)
      x_str[n++] = digit + '0';
    else
      x_str[n++] = digit + 'A' - 10;  /* handle base > 9 */
  }

  /* Terminate string */
  x_str[n] = '\0';

  /* Reverse string */
  for (i=0; i<n/2; i++)
  {
    t = x_str[i];
    x_str[i] = x_str[n-i-1];
    x_str[n-i-1] = t;
  }
  printf ("\n%s\n", x_str);

  return 0;
}

while循环将从给定基数中的整数中删除数字,并以数组的相反顺序输入数字。内部if - else处理基数超过9,并在数字值大于10时放置大写字母。for循环反转字符串并以正向顺序将字符串切换为字符串。

您需要根据最大功能调整x_str数组的大小。为它定义一个宏。请注意,上面的代码仅适用于无符号整数。对于有符号整数,您需要先检查它是否低于0,然后在x_str中添加一个“ - ”符号,然后打印幅度即。将上述代码应用于-x。这也可以通过屏蔽检查符号位来完成,但是会使进程依赖于整数的存储。

base_val是您想要解释数字的基础。

答案 2 :(得分:1)

如果您与PIC16 RISC汇编器兼容,那么这非常简单,快速,简短且有效。在这里你有16位无符号16位除以10 rutine来看看如何做到这一点。

要获得WREG中数字的第一个最小字符,请将16位无符号数字添加到Reg1和Reg2并调用rutine。为了得到下一个字符再次调用rutine,依此类推,直到Reg1和Reg2为0。

RegAE       res 1
RegA0       res 1
RegA1       res 1
RegA2       res 1



    divR16by_c10
    ;{
    ;//Input: 16 bit unsigned number as RegA1,2 (RegA2 low byte, RegA1 High byte)
    ;//Division result: Reg1 and Reg2 and reminder as char in WREG
            clrf    RegA0
            movlw   16             ;//init loop counter
            movwf   RegAE
            lslf    RegA2, f
    divI16by_c10_        
            rlf     RegA1, f
            rlf     RegA0, f       
            movlw   10
            subwf   RegA0, f
            btfsc   Carry
            bra     divI16by_c10_OK
            addwfc  RegA0, f
            bcf     Carry
    divI16by_c10_OK        
            rlf     RegA2, f
            decfsz  RegAE, f
            bra     divI16by_c10_
    ;//result= W from 0..9
            addlw   0x30        ;//convert to char
            return 
    ;}

编辑:

如果要转换已签名 16位值,请先检查第15位,以确定符号编号。如果为负而不是写 - 符号并否定RegA1,2中的数字。之后是程序相同的正数。 要否定数字,您可以使用以下asm rutine:

             comf    RegA2, f
             comf    RegA1, f
             movlw   0
             bsf     STATUS, 0      ;//set carry flag
             addwfc  RegA2, f
             addwfc  RegA1, f 

答案 3 :(得分:1)

很久以前我回答了这样的问题。

Implementing ftoa

我希望这会有所帮助。这适用于整数和浮点数。这个概念很简单。

  1. 确定位数(对于基数10,使用日志库10)
  2. 以(num / digit_weight)
  3. 为准,抓取msb数字
  4. 从数字减去数字*重量并减轻重量1
  5. 再次执行,直到数字== 0表示整数或数字&gt; 0 +对fp数的容差
  6. 由于算法每次迭代都会处理一个数字,因此它的O(logn)时间非常合理。