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

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

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

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

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

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

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

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

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

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

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

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

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

Ну и работает это, кажется, только в VS. Лучше строки считывать с помощью fgets, для этого и предназначенного.
1
Убежденный
Системный программист
Эксперт С++
15637 / 7147 / 1131
Регистрация: 02.05.2013
Сообщений: 11,586
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 00:26 #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
2
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 00:32 #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, если printf_s обнаружит неправильную форматную строку, ...
Разве компилятор VS не следит за этим в compile-time?
0
Убежденный
Системный программист
Эксперт С++
15637 / 7147 / 1131
Регистрация: 02.05.2013
Сообщений: 11,586
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 00:51 #5
Насколько я знаю - нет, не следит (да это в любом случае нельзя
сделать в compile time, если форматная строка не является
строковым литералом).
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:08 #6
Убежденный, а как функция printf_s может следить за соответствием форматной строки с аргументами? Ведь их количество неизвестно функции.
0
Убежденный
Системный программист
Эксперт С++
15637 / 7147 / 1131
Регистрация: 02.05.2013
Сообщений: 11,586
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 01:16 #7
Она проверяет правильность самой форматной строки.
Например, чтобы туда не передали спецификатор, который не поддерживается.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:20 #8
Так и обычная printf не обрабатывает неизвестные спецификаторы.
0
Убежденный
Системный программист
Эксперт С++
15637 / 7147 / 1131
Регистрация: 02.05.2013
Сообщений: 11,586
Записей в блоге: 1
Завершенные тесты: 1
07.11.2015, 01:29 #9
По стандарту C, неизвестный спецификатор в printf - это UB. На одних системах
проглотит, на других оставит без изменений, на третьих выбросит исключение и т.п.
А у printf_s из Visual C++ поведение вполне определенное - будет вызван
invalid_parameter_handler.
1
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
07.11.2015, 01:38 #10
Теперь я понял в чём отличие.
0
Evg
Эксперт CАвтор FAQ
17952 / 6183 / 413
Регистрация: 30.03.2009
Сообщений: 16,974
Записей в блоге: 27
07.11.2015, 14:40 #11
Вот исходник с scnaf'ом - Как ввести однобайтовое число через scanf
Вот аналог со scanf_s'ом - Как ввести однобайтовое число через scanf
И как-то scnaf_s работает не так, как надо. Я с msvs'ом не работал, описания scanf_s'а никогда не читал. Чисто на всякий случай
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2015, 14:40
Привет! Вот еще темы с ответами:

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

В чем разница между вектором и массивом - C++
Я учу язык С/С++ и хотел у вас спросить в чем разница между вектором и массивом ? кроме тогдо что вектор создается vector<int> m; а массив...

В чем разница между f.read(),f.write() и f<<., f>>.? - C++
В чем разница между f.read(),f.write() и f&lt;&lt;..., f&gt;&gt;...?

В чем разница между инициализацией и присваиванием? - C++
в чем разница между инициализацией и присваиванием? практически это одно и тоже,кроме инициализации ссылок-они могут менять значение.


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
07.11.2015, 14:40
Ответ Создать тему
Опции темы

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