В последнее время я заметил странное дело, я хотел бы проверить:символы, написанные до сих пор в snprintf
По SUS для %n
в строке формата, соответствующий int
будет установлен на-сумму-в-байт -written-к-вывода. Кроме того, для snprintf(dest, 3, "abcd")
, dest
укажет на "ab\0"
. Зачем? Потому что на выходе должно быть записано не более n (n = 3) байтов (буфер dest
).
Я сделал вывод, что для кода:
int written;
char dest[3];
snprintf(dest, 3, "abcde%n", &written);
written
будет установлен в 2 (нулевое значение прекращения исключены из подсчета). Но из теста, который я сделал с использованием GCC 4.8.1, written
, было установлено значение 5. Был ли я неверным толкованием стандарта? Это ошибка? Это неопределенное поведение?
Edit:
@wildplasser сказал:
... поведение% п в строке формата может быть определено или определено осуществление ...
И
... реализация должна моделировать обработку полной строки формата (включая% n) ...
@par сказал:
written
является 5, потому что это, сколько символов будет записано в точке%n
встречается. Это правильное поведение.snprintf
копирует только доsize
символов минус завершающим нулем ...
И:
Другой способ смотреть на это, что
%n
бы не даже встречались, если она обрабатывается только вверх 2 символов, так что возможно ожидатьwritten
иметь недопустимое значение ...
И:
... вся строка обрабатывается с помощью
printf()
правил, затем максимальная длина применяется ...
Можно ли проверить быть стандартом, стандарт-проект или какой-либо официальный источник?
Похож на ошибку (в реализации библиотеки) для меня. – pmg
Я ожидаю, что вы должны * сначала посмотреть на возвращаемое значение из snprintf(). «Побочные эффекты» различны; поведение '% n' в строке формата может быть неопределенным или определена реализация, если returnvalue => 2-й аргумент. В любом случае реализация должна * имитировать * обработку строки * полного * формата (включая '% n') для получения правильного возвращаемого значения, поэтому побочный эффект можно получить« на лету ». – wildplasser