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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
El Senor
1 / 1 / 0
Регистрация: 10.02.2015
Сообщений: 56
#1

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

07.11.2015, 00:04. Просмотров 468. Ответов 10
Метки нет (Все метки)

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

Ну и работает это, кажется, только в VS. Лучше строки считывать с помощью fgets, для этого и предназначенного.
Убежденный
Системный программист
 Аватар для Убежденный
14635 / 6596 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 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
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 00:32     В чем разница между scanf_s и scanf? #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, если printf_s обнаружит неправильную форматную строку, ...
Разве компилятор VS не следит за этим в compile-time?
Убежденный
Системный программист
 Аватар для Убежденный
14635 / 6596 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 1
07.11.2015, 00:51     В чем разница между scanf_s и scanf? #5
Насколько я знаю - нет, не следит (да это в любом случае нельзя
сделать в compile time, если форматная строка не является
строковым литералом).
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:08     В чем разница между scanf_s и scanf? #6
Убежденный, а как функция printf_s может следить за соответствием форматной строки с аргументами? Ведь их количество неизвестно функции.
Убежденный
Системный программист
 Аватар для Убежденный
14635 / 6596 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 1
07.11.2015, 01:16     В чем разница между scanf_s и scanf? #7
Она проверяет правильность самой форматной строки.
Например, чтобы туда не передали спецификатор, который не поддерживается.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:20     В чем разница между scanf_s и scanf? #8
Так и обычная printf не обрабатывает неизвестные спецификаторы.
Убежденный
Системный программист
 Аватар для Убежденный
14635 / 6596 / 1045
Регистрация: 02.05.2013
Сообщений: 10,865
Завершенные тесты: 1
07.11.2015, 01:29     В чем разница между scanf_s и scanf? #9
По стандарту C, неизвестный спецификатор в printf - это UB. На одних системах
проглотит, на других оставит без изменений, на третьих выбросит исключение и т.п.
А у printf_s из Visual C++ поведение вполне определенное - будет вызван
invalid_parameter_handler.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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++ В чем разница между push_back и push?
C++ В чем разница между инициализацией и присваиванием?
C++ В чем разница между new и malloc()?
В чем разница между malloc и new? C++
C++ В чем разница между Debug and Release?

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17179 / 5433 / 336
Регистрация: 30.03.2009
Сообщений: 14,720
Записей в блоге: 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?
Ответ Создать тему
Опции темы

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