idjinbowen
idjinbowen
采纳率100%
2017-06-18 14:38 阅读 8.6k

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • 已采纳
    fight_in_dl 战在春秋 2017-06-18 21: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,所以编译会提醒。

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

    点赞 14 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2017-06-18 15:43

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

    点赞 3 评论 复制链接分享
  • weixin_36760331 Leibnezz 2017-07-07 01:17

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

    点赞 1 评论 复制链接分享
  • qq_36243846 UniqueJary 2017-06-18 14:52

    printf原型:

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

    printf_s原型:

    int sprintf_s( 
    char *buffer, 
    size_t sizeOfBuffer, 
    const char *format [, argument] ... 
    );
    
    点赞 评论 复制链接分享
  • qq_34523482 Mr丶Guo 2017-06-20 07:46

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

    点赞 评论 复制链接分享
  • zsx815578323 谶言 2017-06-24 06:03

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

    点赞 评论 复制链接分享

相关推荐