c - 嵌入式系统中的Long Long到char转换功能

时间:2013-09-17 19:17:42

标签: c char long-integer

我正在使用嵌入式系统,我需要实现一种将long long转换为char的方法。

问题是我不能在这个系统中使用sprintf来做到这一点,所以我正在寻找替代的方法/功能来实现它。

欢迎实施LongLongToChar功能的建议。

2 个答案:

答案 0 :(得分:3)

谷歌“itoa”。有很多变化。这是一个例子。

char* itoa(int val, int base){

    static char buf[32] = {0};

    int i = 30;

    for(; val && i ; --i, val /= base)

        buf[i] = "0123456789abcdef"[val % base];

    return &buf[i+1];

}

具体来说,这是'lltoa'。

#include <stdio.h>
#include <limits.h>


char* lltoa(long long val, int base){

    static char buf[64] = {0};

    int i = 62;
    int sign = (val < 0);
    if(sign) val = -val;

    if(val == 0) return "0";

    for(; val && i ; --i, val /= base) {
        buf[i] = "0123456789abcdef"[val % base];
    }

    if(sign) {
        buf[i--] = '-';
    }
    return &buf[i+1];

}

int main() {
    long long a = LLONG_MAX;
    long long b = LLONG_MIN + 1;
    long long c = 23;

    printf("%ld\n", sizeof(a));
    printf("max '%s'\n", lltoa(a, 10));
    printf("min '%s'\n", lltoa(b, 10));
    printf("-1  '%s'\n", lltoa((long long)-1, 10));
    printf("23  '%s'\n", lltoa(c, 10));
}

答案 1 :(得分:1)

使用lldiv(),将CPU节拍保存在单独的/%上 适用于整个long long范围,包括0和令人讨厌的LONG_LONG_MIN

const char *ToString(long long i) {
  static char buffer[sizeof(i)*3 + 1];  // Size could be a bit tighter
  char *p = &buffer[sizeof(buffer)];
  *(--p) = '\0';
  lldiv_t qr;
  qr.quot = i;
  do {
    qr = lldiv(qr.quot, 10);
    *(--p) = abs(qr.rem) + '0';
  } while (qr.quot);
  if (i < 0) {
    *(--p) = '-';
  }
  return p;
}