Форум программистов, компьютерный форум CyberForum.ru

В чем разница между scanf_s и scanf? - C++

Восстановить пароль Регистрация
 
El Senor
1 / 1 / 0
Регистрация: 10.02.2015
Сообщений: 56
07.11.2015, 00:04     В чем разница между scanf_s и scanf? #1
какая разница между scanf_s и scanf?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Epicus
15 / 15 / 10
Регистрация: 25.04.2014
Сообщений: 39
07.11.2015, 00:16     В чем разница между scanf_s и scanf? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
scanf_s принимает дополнительный аргумент, максимальный размер считываемого блока данных. Это важно при считывании строк, чтобы не было переполнения буфера.

Ну и работает это, кажется, только в VS. Лучше строки считывать с помощью fgets, для этого и предназначенного.
Убежденный
Системный программист
 Аватар для Убежденный
14203 / 6218 / 986
Регистрация: 02.05.2013
Сообщений: 10,366
Завершенные тесты: 1
07.11.2015, 00:26     В чем разница между scanf_s и scanf? #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Приставка "s" означает "secure", т.е. более безопасный вариант, хотя эти
функции не являются частью стандарта языка (за что сурово критикуются всеми,
кому не лень).

Secure-версии функций выполняют более тщательную проверку аргументов, некоторые
из них, которые работают со строковыми буферами, выполняют дополнительную работу,
чтобы обеспечить завершающий нуль, у других есть дополнительный параметр size/len,
отсутствующий в оригинальном варианте и т.д. Все сделано для защиты от типичных
ошибок с переполнением буфера, отсутствием завершающего нуля и т.п.

Например, если printf_s обнаружит неправильную форматную строку, она немедленно
вызывает invalid_parameter_handler, в то время как стандартная printf в идентичной
ситуации может повести себя непредсказуемо. Более подробно здесь:

Security Features in the CRT
https://msdn.microsoft.com/en-us/library/8ef0s5kh.aspx
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 00:32     В чем разница между scanf_s и scanf? #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, если printf_s обнаружит неправильную форматную строку, ...
Разве компилятор VS не следит за этим в compile-time?
Убежденный
Системный программист
 Аватар для Убежденный
14203 / 6218 / 986
Регистрация: 02.05.2013
Сообщений: 10,366
Завершенные тесты: 1
07.11.2015, 00:51     В чем разница между scanf_s и scanf? #5
Насколько я знаю - нет, не следит (да это в любом случае нельзя
сделать в compile time, если форматная строка не является
строковым литералом).
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:08     В чем разница между scanf_s и scanf? #6
Убежденный, а как функция printf_s может следить за соответствием форматной строки с аргументами? Ведь их количество неизвестно функции.
Убежденный
Системный программист
 Аватар для Убежденный
14203 / 6218 / 986
Регистрация: 02.05.2013
Сообщений: 10,366
Завершенные тесты: 1
07.11.2015, 01:16     В чем разница между scanf_s и scanf? #7
Она проверяет правильность самой форматной строки.
Например, чтобы туда не передали спецификатор, который не поддерживается.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:20     В чем разница между scanf_s и scanf? #8
Так и обычная printf не обрабатывает неизвестные спецификаторы.
Убежденный
Системный программист
 Аватар для Убежденный
14203 / 6218 / 986
Регистрация: 02.05.2013
Сообщений: 10,366
Завершенные тесты: 1
07.11.2015, 01:29     В чем разница между scanf_s и scanf? #9
По стандарту C, неизвестный спецификатор в printf - это UB. На одних системах
проглотит, на других оставит без изменений, на третьих выбросит исключение и т.п.
А у printf_s из Visual C++ поведение вполне определенное - будет вызван
invalid_parameter_handler.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:38     В чем разница между scanf_s и scanf? #10
Теперь я понял в чём отличие.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2015, 14:40     В чем разница между scanf_s и scanf?
Еще ссылки по теме:

C++ В чем разница между инициализацией и присваиванием?
C++ В чем разница между классом и шаблоном класса?
C++ В чем разница между new и malloc()?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,135
Записей в блоге: 26
07.11.2015, 14:40     В чем разница между scanf_s и scanf? #11
Вот исходник с scnaf'ом - Как ввести однобайтовое число через scanf
Вот аналог со scanf_s'ом - Как ввести однобайтовое число через scanf
И как-то scnaf_s работает не так, как надо. Я с msvs'ом не работал, описания scanf_s'а никогда не читал. Чисто на всякий случай
Yandex
Объявления
07.11.2015, 14:40     В чем разница между scanf_s и scanf?
Ответ Создать тему
Опции темы

Текущее время: 20:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru