sprintf_s和snprintf有什么区别?

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

我在写一个需要

sprintf
函数的程序时遇到了这个问题
在某些情况下,使用 sprintf 函数会导致内存溢出并带来安全风险。
所以您可以使用
snprintf
功能或
sprintf_s
功能来规避这些风险
但是这两个函数的定义是一样的,那么为什么只有这两个函数存在而不是一个呢?

int sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...);
int snprintf(char *__restrict__ __stream, size_t __n, const char *__restrict__ __format, ...);

一开始以为

sprintf_s
函数是Windows库特有的,也以为
snprintf
函数是POSIX特有的
但实际上,这两个函数都包含在
<stdio.h>
库中。

c printf buffer-overflow
3个回答
2
投票

snprintf
sprintf_s
函数之间存在许多差异,特别是在它们的返回值和它们处理错误的方式上。

返回值(错误除外):

  • snprintf
    返回如果忽略“大小”参数, 写入缓冲区的字符数。

  • sprintf_s
    返回字符数actually written.

额外检查

sprintf_s
函数还执行
snprintf
不执行的检查,包括。如果以下任一情况为真,则调用失败(并返回零):

  1. 给出了
    %n
    格式说明符。
  2. %s
    格式说明符对应的任何参数都是空指针。
  3. 给定的“大小”参数为零。

0
投票

snprintf
sprintf_s
之间的主要区别是:

  1. 功能
    snprintf
    在所有符合ISO C的平台上都可用,而功能
    sprintf_s
    在大多数平台上不存在。 (大多数平台不执行标准的附件 K。)
  2. 如果字符串太大,函数
    snprintf
    将静默截断字符串,而函数
    sprintf_s
    将调用当前安装的 contraint handler 函数。
  3. 函数
    sprintf_s
    将执行额外的参数验证(例如检查
    NULL
    指针)并在这些验证失败时调用当前安装的约束处理函数。

-1
投票

您可以在这里找到各种

printf
版本之间的区别:

https://en.cppreference.com/w/c/io/fprintf

© www.soinside.com 2019 - 2024. All rights reserved.