snprintf() 在内部调用 memset() 或类似的吗?

do snprintf() internally call memset() or similar?

为了安全起见,我知道使用 snprintf() 代替 sprintf()。但是,我总是对 snprintf() 使用的缓冲区执行 memset()。我看到一些代码使用了没有 memset() 的函数。而且,它按预期工作。我的意思是缓冲区上没有覆盖。让我举例说明,

char str[100];
snprintf(str, sizeof(str), "Whosebug %zu", sizeof(str));
fprintf(stderr, "%s\n", str);

snprintf(str, sizeof(str), "soner");
fprintf(stderr, "%s\n", str);

直到现在,我认为代码会打印 soneroverflow 100,这就是我使用 memset() 的原因。然而,它打印 soner。它是如何在引擎盖下完成的?顺便说一句,同样的事情适用于 sprintf().

来自snprintf

A terminating null character is automatically appended after the content written.

如果您要检查缓冲区,您会发现

{ 's', 'o', 'n', 'e', 'r', '[=10=]', 'v', 'e', 'r', /* ... */ }