出于安全考虑,我意识到使用snprintf()
代替sprintf()
。但是,我总是对memset()
使用的缓冲区执行snprintf()
。我看到一些使用不带memset()
的函数的代码。并且,它按预期工作。我的意思是缓冲区上没有覆盖。让我举例说明,
char str[100];
snprintf(str, sizeof(str), "stackoverflow %zu", sizeof(str));
fprintf(stderr, "%s\n", str);
snprintf(str, sizeof(str), "soner");
fprintf(stderr, "%s\n", str);
直到现在,我还认为代码可以打印soneroverflow 100
,这就是为什么我使用memset()
的原因。不过,它会打印soner
。如何在后台进行?顺便说一句,sprintf()
也适用相同的内容。
答案 0 :(得分:3)
来自snprintf:
在内容写入后会自动添加一个终止的空字符。
如果要检查缓冲区,您将找到
{ 's', 'o', 'n', 'e', 'r', '\0', 'v', 'e', 'r', /* ... */ }