我正在使用avr-libc 2.0.0和uint64_t中的sprintf函数,似乎无法正常工作。

代码

uint64_t x = 12ull;
char buffer[30];

int len = sprintf(buffer, "%llu", x);
int buffer_len = strlen(buffer);


返回len == 2(确定)和buffer_len == 0(错误!!)。

相同的代码完全适用于uint16_t和uint32_t(也适用于签名版本)。

有什么问题?它是avr-libc的sprintf中的错误吗? (我在gcc中测试了相同的代码,而不是在avr-gcc中测试了,它可以正常工作)。

谢谢。

最佳答案

avr-libc不能使用ll printf修饰符实现打印。


  但是ll length修饰符将中止输出,因为此实现不会操作long long参数。


这是我在10分钟内写的一个小包装:

#include <stdio.h>
#include <stdint.h>

char *uint64_to_str(uint64_t n, char dest[static 21]) {
    dest += 20;
    *dest-- = 0;
    while (n) {
        *dest-- = (n % 10) + '0';
        n /= 10;
    }
    return dest + 1;
}


#define LOG10_FROM_2_TO_64_PLUS_1  21
#define UINT64_TO_STR(n)  uint64_to_str(n, (char[21]){0})


int main(void) {
  printf("Hello World\n");
  printf("%s", UINT64_TO_STR(123456789ull));
  return 0;
}


将输出:

Hello world
123456789

关于c - sprintf和uint64_t(AVR-libc 2.0.0)出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58358244/

10-12 13:35