Я нашел один портативный способ предсказать и / или ограничить количество символов, возвращаемых sprintf и связанными функциями, но он неэффективен, и многие считают его неэлегатным.
Что вы делаете, это создаете временный файл с tmpfile (), fprintf () для этого (который надежно возвращает количество записанных байтов), затем перематываете и читаете весь или часть текста в буфер.
Пример:
int my_snprintf(char *buf, size_t n, const char *fmt, ...)
{
va_list va;
int nchars;
FILE *tf = tmpfile();
va_start(va, n);
nchars = vfprintf(tf, fmt, va);
if (nchars >= (int) n)
nchars = (int) n - 1;
va_end(va);
memset(buf, 0, 1 + (size_t) nchars);
if (nchars > 0)
{
rewind(tf);
fread(buf, 1, (size_t) nchars, tf);
}
fclose(tf);
return nchars;
}