C语言 sprintf 和 uint64_t (avr-libc 2.0.0) 的问题



我正在 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 冲刺中的错误吗?(我在 gcc 中测试相同的代码,而不是在 avr-gcc 中,它工作正常(。

谢谢。

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

但是 ll 长度修饰符将中止输出,因为这种实现不会操作长参数。

这是我在 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 Worldn");
printf("%s", UINT64_TO_STR(123456789ull));
return 0;
}

将输出:

Hello world
123456789

最新更新