Почему printf выдает ошибку из-за спецификатора формата n?

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

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

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

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

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

фото отладки


person NackyLuke    schedule 16.04.2020    source источник
comment
Я думаю, вы хотели использовать scanf, а не printf. Пожалуйста, изучите это.   -  person Mahmood Darwish    schedule 16.04.2020
comment
Нет, printf с% n   -  person NackyLuke    schedule 16.04.2020


Ответы (2)


Если вы используете компилятор 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

person cdev    schedule 17.04.2020
comment
Да, спасибо, вы правы, я уже видел этот ответ в некоторых похожих темах, но мой компилятор (кодовые блоки компилятора GNU GCC) отказывается от этой строки. Может быть, он будет работать с компилятором Visual c ++ ... Не знаю. В любом случае теперь я знаю, в чем проблема. Спасибо еще раз. - person NackyLuke; 19.04.2020

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

Результат:

введите здесь описание изображения

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

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

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

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

person Michał Z.    schedule 16.04.2020
comment
спасибо, но вот моя отладка i.stack.imgur.com/jJTcS.png - person NackyLuke; 16.04.2020
comment
это не важно для моего проекта, но я не знаю, почему у printf такое поведение ... - person NackyLuke; 17.04.2020
comment
В онлайн-отладчике (onlinegdb.com/online_c++_debugger) он также работает правильно: imgur.com/a/4ZYoVH1 - person Michał Z.; 17.04.2020
comment
Для меня эти две вещи могут произойти на вашей стороне: 1) У вас сломался отладчик / компилятор C или общая неправильная конфигурация среды 2) Что приводит к сбою printf (поэтому он возвращает -1, а% n не работает. Попробуйте проверить индикатор ошибки (ferror) : cplusplus.com/reference/cstdio/printf (см. документацию по возвращаемому значению) - person Michał Z.; 17.04.2020
comment
Даже значение j неверно в загруженном изображении. Я бы посоветовал вам перекомпилировать его снова, используя для отладки простой старый GDB. Что-то не так в программе просмотра, в которой вы отслеживаете - person D.Malim; 17.04.2020
comment
Да, я предполагал что-то в этом роде. У моего друга, использующего CadeBlocks, тоже была такая же проблема. Спасибо вам всем! - person NackyLuke; 17.04.2020