Почему в printf возникает ошибка с указателем формата n? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть некоторый код C с %n printf:

#include <stdio.h>
int main(){
    int i, j;
    i = printf( "something%n", &j );
    return i + j; 
}

Нет ошибок при компиляции и выполнении. printf печатает строку "что-то".

Почему мой printf возвращает -1 и почему он не сохраняет параметр n в j?

Вот фотография во время отладки ..

debug photo

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Если вы используете компилятор Microsoft C и запускаете программу на Windows, то по умолчанию использование% n с printf действительно завершится неудачей. Это связано с тем, что Microsoft рассматривает% n как угрозу безопасности и по умолчанию отключает ее в printf и связанных с ней функциях форматирования печати. ​​

Чтобы включить% n, добавьте следующую строку в начале вашей программы:

_set_printf_count_output(1);

Это описано в важной заметке о% n в следующей статье справки:

Синтаксис спецификации формата: функции printf и wprintf https://docs.microsoft.com/en-us/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions

1 голос
/ 16 апреля 2020

Я скомпилировал ваш код и подтвердил, вы можете проверить его здесь: https://onlinegdb.com/BJIF5EUOI

Результат:

enter image description here

Кажется, что он работает нормально в соответствии с документацией (http://www.cplusplus.com/reference/cstdio/printf/)

printf возвращено общее количество написанных символов, результат сохранен в i переменная

%n сохраненное количество символов, написанных до сих пор под j

main() возвращено i + j - таким образом, 2x общее количество написанных символов

...