Проблема с sprintf и uint64_t (avr-libc 2.0.0) - PullRequest
0 голосов
/ 12 октября 2019

Я играю с функцией sprintf в avr-libc 2.0.0 и uint64_t, и кажется, что она не работает должным образом.

Код

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 (а также для подписанной версии).

В чем проблема? Это ошибка в sprintf из avr-libc? (Я тестирую один и тот же код в gcc, а не в avr-gcc, и он работает нормально).

Спасибо.

1 Ответ

0 голосов
/ 13 октября 2019

avr-libc не реализует печать с модификатором ll printf.

Но модификатор длины 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 World\n");
  printf("%s", UINT64_TO_STR(123456789ull));
  return 0;
}

выдаст:

Hello world
123456789
...