【问题标题】:Problem with sprintf and uint64_t (avr-libc 2.0.0)sprintf 和 uint64_t (avr-libc 2.0.0) 的问题
【发布时间】:2019-10-12 20:33:51
【问题描述】:

我在玩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(ok)和buffer_len == 0(错误!!!)。

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

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

谢谢。

【问题讨论】:

    标签: c printf avr libc


    【解决方案1】:

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

    但是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      相关资源
      最近更新 更多