Как указано в документации Microsoft , %n
по умолчанию отключено в библиотеке Microsoft C, используемой в вашей системе MinGW:
Важно
Поскольку формат %n
изначально небезопасен, по умолчанию он отключен.Если в строке формата встречается %n
, вызывается недопустимый обработчик параметра, как описано в разделе «Проверка параметров».Чтобы включить поддержку %n
, см. _set_printf_count_output
.
Вопрос о том, является ли %n
на самом деле небезопасным, как заявляет Microsoft, вызывает большие сомнения.Примеры, показанные в поддержку этого утверждения, объединяют эту функцию printf
с использованием строки переменного формата, которая может быть изменена злоумышленником из-за ошибки переполнения буфера.
В некоторых системах Microsoft (но, возможно, не самой последней), вы могли бы исправить вашу программу следующим образом:
#include <stdio.h>
int main(void) {
int n;
_set_printf_count_output(1);
fprintf(stdout, "Hello%n World\n", &n);
fprintf(stdout, "n: %d\n", n);
return 0;
}
Для более портативного подхода здесь есть обходной путь, чтобы избежать использования %n
и при этом получить те же результаты:
#include <stdio.h>
int main(void) {
int n;
n = fprintf(stdout, "Hello");
fprintf(stdout, " World\n");
fprintf(stdout, "n: %d\n", n);
return 0;
}
Вывод:
Hello World
n: 5