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 的 sprintf 中的错误吗?(我在 gcc 中测试了相同的代码,而不是在 avr-gcc 中,它工作正常)。
谢谢。
解决方案
avr-libc不使用 printf 修饰符实现打印ll
。
但是 ll 长度修饰符将中止输出,因为这种实现不会操作 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
推荐阅读
- r - 如何从下面的 for 循环中创建一个函数
- ios - 你如何为组合 UICollectionViewLayouts 制作 NSCollectionLayoutVisibleItem 动画?
- python - Pyinstaller 问题,当我尝试制作 exe 文件时
- sql-server - 更新查询需要更多时间
- c++ - 在函数范围之外持久化变量
- google-apps-script - Google Apps 脚本客户端到服务器
- python - 有没有办法在 Python 中用 4h 制作 bdate_range 而没有周末?
- c# - 用组合理解 CRUD
- c - 使用 ARM 程序集进行快速排序 - 分段错误
- node.js - 使用 Mongoose 在过去 30 天内从子数组中查找值