以下代码会导致错误并杀死我的应用程序。这很有意义,因为缓冲区只有10个字节长,文本长度为22个字节(缓冲区溢出)。带缓冲区太小的sprintf_s
char buffer[10];
int length = sprintf_s(buffer, 10, "1234567890.1234567890.");
如何捕获此错误,以便报告而不是崩溃我的应用程序?
编辑:
阅读下面的评论我_snprintf_s去后。如果它返回-1值,那么缓冲区没有更新。
length = _snprintf_s(buffer, 10, 9, "123456789");
printf("1) Length=%d\n", length); // Length == 9
length = _snprintf_s(buffer, 10, 9, "1234567890.1234567890.");
printf("2) Length=%d\n", length); // Length == -1
length = _snprintf_s(buffer, 10, 10, "1234567890.1234567890.");
printf("3) Length=%d\n", length); // Crash, it needs room for the NULL char
传递的缓冲区大小和缓冲区大小减去一个是钝的,而且容易出错。您应该更喜欢下面描述的变体: length = _snprintf_s(buffer,_TRUNCATE,“1234567890.1234567890。”); 由于省略了第一个大小参数,因此编译器使用模板过载来推断大小。 _TRUNCATE是一个特殊的值,它可以完成它所说的事情。没有幻数,现在你的代码是安全的,可维护的,并且是一个很好的例子。 如果你喜欢这个评论和_snprintf_s,那么你应该选择我的答案,而不是危险的snprintf/_snprintf答案。 – 2014-12-17 22:40:06