Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
El Senor
1 / 1 / 0
Регистрация: 10.02.2015
Сообщений: 56
1

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

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

какая разница между scanf_s и scanf?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2015, 00:04
Ответы с готовыми решениями:

Какая разница между cin и scanf?
Здраствуйте. А какая разница между cin и scanf?

В чем разница между С и С++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы...

В чем разница между X x; и X x()?
Корректный ли этот ответ?

В чем разница между [] и * ?
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в...

В чем разница между malloc и new?
в чем разница? что лучше использовать?

10
Epicus
15 / 15 / 11
Регистрация: 25.04.2014
Сообщений: 39
07.11.2015, 00:16 2
Лучший ответ Сообщение было отмечено El Senor как решение

Решение

scanf_s принимает дополнительный аргумент, максимальный размер считываемого блока данных. Это важно при считывании строк, чтобы не было переполнения буфера.

Ну и работает это, кажется, только в VS. Лучше строки считывать с помощью fgets, для этого и предназначенного.
1
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 00:26 3
Лучший ответ Сообщение было отмечено El Senor как решение

Решение

Приставка "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
2
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 00:32 4
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, если printf_s обнаружит неправильную форматную строку, ...
Разве компилятор VS не следит за этим в compile-time?
0
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 00:51 5
Насколько я знаю - нет, не следит (да это в любом случае нельзя
сделать в compile time, если форматная строка не является
строковым литералом).
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:08 6
Убежденный, а как функция printf_s может следить за соответствием форматной строки с аргументами? Ведь их количество неизвестно функции.
0
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 01:16 7
Она проверяет правильность самой форматной строки.
Например, чтобы туда не передали спецификатор, который не поддерживается.
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:20 8
Так и обычная printf не обрабатывает неизвестные спецификаторы.
0
Убежденный
Ушел с форума
Эксперт С++
16126 / 7273 / 1181
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 01:29 9
По стандарту C, неизвестный спецификатор в printf - это UB. На одних системах
проглотит, на других оставит без изменений, на третьих выбросит исключение и т.п.
А у printf_s из Visual C++ поведение вполне определенное - будет вызван
invalid_parameter_handler.
1
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:38 10
Теперь я понял в чём отличие.
0
Evg
Эксперт CАвтор FAQ
19305 / 7160 / 533
Регистрация: 30.03.2009
Сообщений: 20,041
Записей в блоге: 30
07.11.2015, 14:40 11
Вот исходник с scnaf'ом - Как ввести однобайтовое число через scanf
Вот аналог со scanf_s'ом - Как ввести однобайтовое число через scanf
И как-то scnaf_s работает не так, как надо. Я с msvs'ом не работал, описания scanf_s'а никогда не читал. Чисто на всякий случай
0
07.11.2015, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2015, 14:40

В чем разница между new и malloc()?
Всем доброго дня ! Начал читать книгу Пахомов Б. "C/C++ и MS Visual C++ 2008...

В чем разница между Рекурсией и Итерацией?
Рекурсия позволяет сэкономить время но требует больше памяти, а циклы длятся...

В чем разница между Double и Float?
Хмм? :(


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru