c++里printf和printf_s有什么区别?
有时候会警告不安全
简单的说,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也会报错。
有兴趣的话,可以深入研究,如果只是使用的话,按照函数原型说明调用printf_s就行。
自c++11后,微软推荐使用更安全的printf_s,所以编译会提醒。
用心回答每个问题,如果对您有帮助,请采纳答案好吗,谢谢!
printf_s即安全版本safe.相比printf更安全。教你一个在线快速访问MSDN的方法,在浏览器上输入printf site:microsoft.com.当然也可以把printf换做其他需要搜索的东西啦。
printf原型:
int printf(
const char* format [, argument]...
);
printf_s原型:
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format [, argument] ...
);
后者因为增加了一个表示缓冲区大小的参数,所以是安全的。前者因为依赖字符串的\0,如果没有这个结束符,则会一直往下,数组越界,导致堆栈被破坏。
所以,printf和printf_s的区别就在于printf只会检查格式字符串是否为空,而printf_s还会检查用户自定义的格式字符串是否合法。
printf和printf_s的区别就在于printf只会检查格式字符串是否为空,而printf_s还会检查用户自定义的格式字符串是否合法。