Как получить последние символы форматированного вывода, когда snprintf возвращает больше, чем его аргумент размера? - PullRequest
0 голосов
/ 19 января 2019

У меня есть буфер длиной 65536 символов. Мне нужно распечатать форматированный вывод в буфер. Проблема в том, что: если форматированный выходной размер окажется больше 65535, я бы хотел, чтобы в буфере были последние символы, отбрасывая первые, а не оставшиеся, как snprintf.

Я думал о реализации логики snprintf, но начиная с конца строки, а не с начала.

Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 19 января 2019

Решение:

#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>

int snprintfEnd(char *str, size_t size, const char *format, ...)
{
  va_list ap1, ap2;

  va_start(ap1, format);
  va_copy(ap2, ap1);

  /* get length of all */
  int sz = vsnprintf(0, 0, format, ap2);

  va_end(ap2);

  /* get all */
  char * all = malloc(sz + 1);

  vsprintf(all, format, ap1);
  va_end(ap1);

  /* copy the expected part */
  int r;

  if (sz < size) {
    strcpy(str, all);
    r = sz;
  }
  else {
    strcpy(str, all + sz - size);
    r = size;
  }

  free(all);
  return r;
}

int main()
{
  char s[6];

  int ln = snprintfEnd(s, 5, "%d %d %d", 1, 234, 567);

  printf("%d : '%s'\n", ln, s);

  return 0;
}

Исполнение:

5 : '4 567'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...