LINUX.ORG.RU

snprintf().


0

0

Хотелось бы разобраться в функции snprintf(). Есть код: #define MAXLINE 4096 char buff[MAXLINE+1]; ssize_t n=read(readfd, buff, MAXLINE); snprintf(buff+n, sizeof(buff)-n, ": can't open, %s\n", strerror(errno)); 1. Как выглядит прототип функции snprintf()? 2. В чем разница назначение первого аргумента snprintf() и sprintf()? 3. Теперь самое главное: зачем мы в первом аргументе прибавляем buff+n?? 4. Ну и зачем вычитаем sizeof(buff)-n? Почему размер приемного буфера должен быть именно таким?

anonymous

>1. Как выглядит прототип функции snprintf()

man snprintf

>2. В чем разница назначение первого аргумента snprintf() и sprintf()?

сравниваем man `sprintf' и `man snprintf'

>3. Теперь самое главное: зачем мы в первом аргументе прибавляем buff+n??

автор кода выпендривается

>4. Ну и зачем вычитаем sizeof(buff)-n? Почему размер приемного буфера должен быть именно таким?

>#define MAXLINE 4096
>char buff[MAXLINE+1];
>ssize_t n=read(readfd, buff, MAXLINE);
>snprintf(buff+n, sizeof(buff)-n, ": can't open, %s\n", strerror(errno));

Это есть баг.
Если read при ошибке вернет -1 получим buf-1. Т.е. затрем что-то в
стеке 

kosmonavt
()
Ответ на: комментарий от kosmonavt

ЗЫ

sizeof(buff)-n для n==-1 получим sizeof(buff)+1

размер, переданный в snprintf больше фактического размера buf[]

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.