В чем разница между printf и printf_s в C? - PullRequest
0 голосов
/ 11 апреля 2019

Я просто хочу узнать разницу, и я уже пробовал поиск в Google.

printf () printf_s ()

1 Ответ

0 голосов
/ 11 апреля 2019

Я узнал что-то новое сегодня.Я никогда не использовал функции _s и всегда предполагал, что они являются расширениями, поставляемыми поставщиком, но на самом деле они определены в стандарте языка в Приложении K «Интерфейсы проверки границ».Относительно printf_s:

K.3.5.3.3 Функция printf_s

Конспект

1 <code>#define _ _STDC_WANT_LIB_EXT1_ _ 1
  #include <stdio.h>
  int printf_s(const char * restrict format, ...);</code>
Ограничения времени выполнения

2 <strong>format</strong> не должны быть нулевым указателем.Спецификатор %n 394) (измененный или не измененный с помощью флагов, ширины поля или точности) не должен появляться в строке, на которую указывает <strong>format</strong>.Любой аргумент <strong>printf_s</strong>, соответствующий спецификатору <strong>%s</strong>, не должен быть нулевым указателем.

3 При нарушении ограничения времени выполнения функция printf_s не пытаетсяпроизводить дальнейшие выходные данные, и неизвестно, в какой степени <strong>printf_s</strong> произвел выходные данные, прежде чем обнаружит нарушение ограничения времени выполнения.

Описание

4 *Функция 1041 * эквивалентна функции printf, за исключением явных ограничений времени выполнения, перечисленных выше.

Возвращает

5Функция printf_s возвращает количество переданных символов или отрицательное значение, если произошла ошибка вывода, ошибка кодирования или нарушение ограничения времени выполнения.
394) Не является нарушением ограничения времени выполнения для символов %n, которые должны появляться в последовательности в строке, на которую указывает формат, когда эти символы не интерпретируются как %n спецификатор.Например, если вся строка формата была %%n.

C 2011 Draft Online

Подводя итог, printf_s выполняет дополнительную проверку во время выполнения своих аргументов, не выполненных printf, и не будет пытаться продолжить работу, если какая-либо из этих проверок во время выполнения не удалась.

Функции _s необязательны , и компилятор не обязан их поддерживать.Если они поддерживаются, макрос __STDC_WANT_LIB_EXT1__ будет определен как 1, поэтому, если вы хотите использовать их, вам нужно что-то вроде

#if __STDC_WANT_LIB_EXT1__ == 1
    printf_s( "%s", "This is a test\n" );
#else
    printf( "%s", "This is a test\n" );
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...