printf 和 printf_s 有什么区别?

问题描述 投票:0回答:1

我只是想知道其中的区别,我已经尝试过在谷歌上搜索。

  • printf()
  • printf_s()
c printf
1个回答
6
投票

今天我学到了一些新东西。我从未使用过

_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
按顺序出现在指向的字符串中并不是运行时约束违规 当这些字符不被解释为
%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 test\n" );
#else
    printf( "%s", "This is a test\n" );
#endif
© www.soinside.com 2019 - 2024. All rights reserved.