Ваша проблема в том, что из-за условия for
*p
вы ожидаете, что он остановится на первом NULL, только это не так?
Итак, ваш вопрос: «почему он не останавливается на первом NULL?». Ответ: из-за постинкремента в операторе switch()
. Сначала он оценивает блок переключателей, затем увеличивает указатель. Так что в вашем конкретном случае происходит то, что когда функция видит знак процента, она попадает в оператор switch. Поскольку NULL не является допустимым спецификатором формата, блок коммутатора по умолчанию выводит его. Затем из-за постинкремента указатель перемещается на один символ вперед, что составляет d
. Следовательно, *p
работает как d
, что не равно 0, поэтому условие в цикле for определено как истинное.
РЕДАКТИРОВАТЬ: Там есть ошибка, IMO, но это на самом деле не эта: это факт, что неправильные спецификаторы формата молча отбрасываются конструкцией по умолчанию. Кроме того, может быть крайний случай, если вы сделаете что-то вроде minprintf("whoopsie%");
, где цикл for будет пытаться выполнить итерации за концом строки!