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

Posted

技术标签:

【中文标题】snprintf() 是不是在内部调用 memset() 或类似的?【英文标题】:do snprintf() internally call memset() or similar?snprintf() 是否在内部调用 memset() 或类似的? 【发布时间】:2018-06-20 08:05:28 【问题描述】:

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

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

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

到目前为止,我认为代码会打印soneroverflow 100,这就是我使用memset() 的原因。尽管如此,它还是打印了soner。它是如何在引擎盖下完成的?顺便说一句,sprintf() 也是一样的。

【问题讨论】:

在调用sprintfsnprintf 之前,您无需对缓冲区进行任何操作。在使用strcpy 之前,你也不会打电话给memset,是吗? @snr 原因在下面的答案中解释。 对于声誉 >3k 并且对 C 标记问题有很多答案的人来说,这是一个奇怪的问题。 @Jabberwocky 也许你对strncpy() 感到困惑——如果它填满了输出缓冲区,它就不会写入 NUL。 【参考方案1】:

来自snprintf:

在写入内容后会自动附加一个终止空字符。

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

 's', 'o', 'n', 'e', 'r', '\0', 'v', 'e', 'r', /* ... */ 

【讨论】:

@snr sprintf doesn't put null terminator:如果是这种情况,那么要么您的sprintf 实现被破坏,要么您的程序事先做了坏事导致未定义的行为。请编辑您的问题并发布minimal reproducible example。 @Jabberwocky 这是因为我缺乏知识,sprintf 也是空终止的。 @snr sprintfsnprintf 非常相似,都是 NUL 终止字符串。

以上是关于snprintf() 是不是在内部调用 memset() 或类似的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在内部调用快速导出方法?

Spark 程序在内部调用 HDFS:/apps/hive/warehouse

nvcc 是不是在内部支持“-pthread”选项?

useAuthState() 是不是每次都使用 cookie 或请求?它在内部如何运作?

为啥 ArrayList 在内部使用 Object[](而不是 E[])? [复制]

ListView,是不是有一种简单的方法可以允许在内部拖动项目(内置)?