2 idjinbowen idjinbowen 于 2017.06.18 22:38 提问

c++里printf和printf_s有什么区别?

c++里printf和printf_s有什么区别?
有时候会警告不安全

6个回答

fight_in_dl
fight_in_dl   Ds   Rxr 2017.06.19 05:40
已采纳

简单的说,printf_s的安全性更强。

引自: msdn(printf_s)

The main difference between printf_s and printf is that printf_s checks the format string for valid formatting characters, whereas printf only checks if the format string is a null pointer.

主要区别就在于printf只会检查格式字符串是否为空(null),而printf_s还会检查格式字符串是否合法。

一个例子:

    char* value = "Hello world!";
    char* formatStr = "%s%d%h\n";

    printf(formatStr, test,10);   // 可以输出“Hello world!10”
    printf_s(formatStr, test, 10); //会报错

实际上,以上只是一个比较简单的例子,当出现以下情况时,printf_s也会报错。

  • the conversion specifier %n is present in format
  • any of the arguments corresponding to %s is a null pointer
  • format or buffer is a null pointer
  • bufsz is zero or greater than RSIZE_MAX
  • encoding errors occur in any of string and character conversion specifiers

有兴趣的话,可以深入研究,如果只是使用的话,按照函数原型说明调用printf_s就行。
自c++11后,微软推荐使用更安全的printf_s,所以编译会提醒。

用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!

HuaXiaWuAi
HuaXiaWuAi +"_s"表示该函数的安全版
6 个月之前 回复
idjinbowen
idjinbowen 另:修仙至 05:40 大佬厉害
6 个月之前 回复
idjinbowen
idjinbowen 蟹蟹答主:)
6 个月之前 回复
caozhy
caozhy 这个回答很详细,赞
6 个月之前 回复
fight_in_dl
fight_in_dl 例子中char* value 应该是 char* test
6 个月之前 回复
caozhy
caozhy   Ds   Rxr 2017.06.18 23:43

后者因为增加了一个表示缓冲区大小的参数,所以是安全的。前者因为依赖字符串的\0,如果没有这个结束符,则会一直往下,数组越界,导致堆栈被破坏。

qq_34523482
qq_34523482   2017.06.20 15:46

所以,printf和printf_s的区别就在于printf只会检查格式字符串是否为空,而printf_s还会检查用户自定义的格式字符串是否合法。

zsx815578323
zsx815578323   2017.06.24 14:03

printf和printf_s的区别就在于printf只会检查格式字符串是否为空,而printf_s还会检查用户自定义的格式字符串是否合法。

weixin_36760331
weixin_36760331   2017.07.07 09:17

printf_s即安全版本safe.相比printf更安全。教你一个在线快速访问MSDN的方法,在浏览器上输入printf site:microsoft.com.当然也可以把printf换做其他需要搜索的东西啦。

qq_36243846
qq_36243846   2017.06.18 22:52

printf原型:

int printf( 
const char* format [, argument]... 
 );

printf_s原型:

int sprintf_s( 
char *buffer, 
size_t sizeOfBuffer, 
const char *format [, argument] ... 
);
Csdn user default icon
上传中...
上传图片
插入图片