В чем разница между printf и printf_s в C?

#c

#c

Вопрос:

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

printf() printf_s()

Ответ №1:

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

K.3.5.3.3 printf_s Функция

Краткий обзор

1  #define _ _STDC_WANT_LIB_EXT1_ _ 1
  #include <stdio.h>
  int printf_s(const char * restrict format, ...);  

Ограничения времени выполнения

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

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

Описание

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

ВОЗВРАТ

5 printf_s Функция возвращает количество переданных символов или отрицательное значение, если произошла ошибка вывода, ошибка кодирования или нарушение ограничений времени выполнения.


394) %n Появление символов в последовательности в строке, на которую указывает format, не является нарушением ограничений времени выполнения, если эти символы не интерпретируются как %n спецификатор. Например, если вся строка формата была %%n .

Онлайн-черновик C 2011

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

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

 #if __STDC_WANT_LIB_EXT1__ == 1
    printf_s( "%s", "This is a testn" );
#else
    printf( "%s", "This is a testn" );
#endif
  

Комментарии:

1. «Я … всегда предполагалось, что это расширения, поставляемые поставщиком» Я считаю, что это были расширения, поставляемые поставщиком, в частности, это были проприетарные расширения Microsoft Visual Studio. Но позже им удалось привести их в соответствие со стандартом C.