В 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++ -> Препроцессор -> Определение препроцессора НЕ РАБОТАЕТ (!)
C/C++
Проблемы со scanf_s и scanf в MVS2015
В Visual Studio 2019 доступны старые функции, если отключить SDL checks.
Функции *_s как правило отличаются по параметрам от классических функций, поэтому нельзя просто так заменить старые функции на новые. Надо смотреть документацию.
> НЕ работает версия: scanf_s("%19s", word);
Где написано, что это должно работать?
Поддержка GCC есть во многих IDE: Eclipse, NetBeans, Code::Blocks, Qt Creator и др.
Функции *_s как правило отличаются по параметрам от классических функций, поэтому нельзя просто так заменить старые функции на новые. Надо смотреть документацию.
> НЕ работает версия: scanf_s("%19s", word);
Где написано, что это должно работать?
Поддержка GCC есть во многих IDE: Eclipse, NetBeans, Code::Blocks, Qt Creator и др.
scanf_s("%s", word, _countof(word));
В том и заключается потокобезопасность этой функции, что она не позволяет при вводе с клавиатуры переполнить буфер, выделенный под данную строку
В том и заключается потокобезопасность этой функции, что она не позволяет при вводе с клавиатуры переполнить буфер, выделенный под данную строку
Виталя Ровенских
Зачем же тогда флаги в строке форматирования? Например, часто пишут, что "%20s" в качестве строки форматирования поможет компилятору понять, что максимум нужно считывать 20 символов.
Как говорил мой наставник по Си, "это не компилятор глючит, это может ты сам глючишь?". :)
scanf() - это простейшая базовая функция ввода. Нужно сильно "перестараться", чтобы эта функция не работала.
Во-первых, не вижу ваш исходник кода, чтобы судить об "ошибках" scanf().
Во-вторых, не известно, как объявлена переменная word. Если word объявлена тупо как строковая константа, например, char *word, то это ошибка кодера, а не компилятора. Ибо константе нужно присваивать значение при её объявлении или значение от другой константы или символьного массива.
Для стандартного ввода строки текста в scanf() используется символьный массив, например, char str[20]. При этом он без ошибок получит значение как при scanf("%s", str), так и при scanf("%s", &str).
Это уже проверено +100500 раз при написании массы кода. ;)
Функции языка Си требуют внимательности и собранности.
Никакой гoвнoкoд, как в C++, здесь не прокатит. Хоть ругай, хоть на стены прыгай, хоть пальцы оттопыривай. +_-
scanf() - это простейшая базовая функция ввода. Нужно сильно "перестараться", чтобы эта функция не работала.
Во-первых, не вижу ваш исходник кода, чтобы судить об "ошибках" scanf().
Во-вторых, не известно, как объявлена переменная word. Если word объявлена тупо как строковая константа, например, char *word, то это ошибка кодера, а не компилятора. Ибо константе нужно присваивать значение при её объявлении или значение от другой константы или символьного массива.
Для стандартного ввода строки текста в scanf() используется символьный массив, например, char str[20]. При этом он без ошибок получит значение как при scanf("%s", str), так и при scanf("%s", &str).
Это уже проверено +100500 раз при написании массы кода. ;)
Функции языка Си требуют внимательности и собранности.
Никакой гoвнoкoд, как в C++, здесь не прокатит. Хоть ругай, хоть на стены прыгай, хоть пальцы оттопыривай. +_-
Goga Gusev
> Нужно сильно "перестараться", чтобы эта функция не работала.
Значит в Microsoft-е перестарались.
Ты просто не в курсе, что в Visual Studio есть такая проблема.
Значит в Microsoft-е перестарались.
Ты просто не в курсе, что в Visual Studio есть такая проблема.
Виталя Ровенских
Евгений, всё мимо. Вы ответили на те вопросы, которые никто не задавал. Проблема не в этом. Да, компилятор всегда прав. Но конкретно Visual Studio 2015 года с её фичами, добавленными к компилятору, ведет себя странно.
для старых и новых функций нужно подключать отдельные библиотеки
Похожие вопросы
- Как ввести строчный массив через scanf_s в языке Си
- Буфер в безопасных версиях команд. strcpy_s, sprintf_s (Си)
- Писать код функции S(x) вычисления сумму ряда с заданной точностей
- Язык С. Что значит данная конструкция? while(*s++=*c++) Заранее спасибо!
- Проблемы с сортировкой массива методом пузырька.
- Проблема с указателем в C++
- Проблема с памятью?
- Программирование в C++, проблема с дополнительной функцией.
- Как это реализовать в с++? вычислить сумму S =1*3+3*5+5*7 +..+(2n -1)(2n +1) для заданного n
- C++, Как сделать тип возврата из функции по ситуации / динамический? P.S.auto не поможет
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 хоть как-то завелась.