C/C++

Проблемы со scanf_s и scanf в MVS2015

В 2015 студии не работает адекватно функции ввода scanf(). Начинает ругаться, что ему нужна безопасная функция scanf_s(). Окей, начинаю использовать её, всё равно ругается.

Работает только такая версия: scanf_s("%19s", word, (unsigned)_countof(word));
НЕ работает версия: scanf_s("%19s", word);

Вопрос: Почему и какого черта? Когда даже в документации написано, что третий параметр с контролем количества символов вообще не обязательный.

Почему всё так плохо в MVS ? Гораздо проще тогда писать в блокноте и компилировать через GCC.

Кстати, решения с #define _CRT_SECURE_NO_WARNINGS НЕ РАБОТАЕТ(!)
Решение с отключением SDL НЕ РАБОТАЕТ(!)
Решение с дополнением в свойствах проекта -> свойства конфигурации -> C/C++ -> Препроцессор -> Определение препроцессора НЕ РАБОТАЕТ (!)
В Visual Studio 2019 доступны старые функции, если отключить SDL checks.
Функции *_s как правило отличаются по параметрам от классических функций, поэтому нельзя просто так заменить старые функции на новые. Надо смотреть документацию.

> НЕ работает версия: scanf_s("%19s", word);
Где написано, что это должно работать?

Поддержка GCC есть во многих IDE: Eclipse, NetBeans, Code::Blocks, Qt Creator и др.
Goga Gusev
Goga Gusev
58 065
Лучший ответ
Виталя Ровенских В официальной документации так написано, что как будто достаточно двух параметров, чтобы работала.
https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=msvc-160
А на практике получается, что третьим параметром надо передавать количество элементов в строке (unsigned)_countof(s) , чтобы scanf_s хоть как-то завелась.
scanf_s("%s", word, _countof(word));
В том и заключается потокобезопасность этой функции, что она не позволяет при вводе с клавиатуры переполнить буфер, выделенный под данную строку
Виталий Бадров
Виталий Бадров
85 187
Виталя Ровенских Зачем же тогда флаги в строке форматирования? Например, часто пишут, что "%20s" в качестве строки форматирования поможет компилятору понять, что максимум нужно считывать 20 символов.
Как говорил мой наставник по Си, "это не компилятор глючит, это может ты сам глючишь?". :)

scanf() - это простейшая базовая функция ввода. Нужно сильно "перестараться", чтобы эта функция не работала.
Во-первых, не вижу ваш исходник кода, чтобы судить об "ошибках" scanf().
Во-вторых, не известно, как объявлена переменная word. Если word объявлена тупо как строковая константа, например, char *word, то это ошибка кодера, а не компилятора. Ибо константе нужно присваивать значение при её объявлении или значение от другой константы или символьного массива.
Для стандартного ввода строки текста в scanf() используется символьный массив, например, char str[20]. При этом он без ошибок получит значение как при scanf("%s", str), так и при scanf("%s", &str).
Это уже проверено +100500 раз при написании массы кода. ;)

Функции языка Си требуют внимательности и собранности.
Никакой гoвнoкoд, как в C++, здесь не прокатит. Хоть ругай, хоть на стены прыгай, хоть пальцы оттопыривай. +_-
Улан Эркинов
Улан Эркинов
37 945
Goga Gusev > Нужно сильно "перестараться", чтобы эта функция не работала.
Значит в Microsoft-е перестарались.
Ты просто не в курсе, что в Visual Studio есть такая проблема.
Виталя Ровенских Евгений, всё мимо. Вы ответили на те вопросы, которые никто не задавал. Проблема не в этом. Да, компилятор всегда прав. Но конкретно Visual Studio 2015 года с её фичами, добавленными к компилятору, ведет себя странно.
для старых и новых функций нужно подключать отдельные библиотеки