2012-07-20 55 views

回答

18

_开头的全局名称空间中的标识符被保留用于实现。 _snprintf只是实现(Visual Studio)提供的一个函数。至于其基本原理,Visual Studio实现了C89,而snprintf是后来的C99标准的一部分。

除此之外,两种功能的语义是在返回类型,它在snprintf始终是格式化的字符串采用(是否有在缓冲足够的空间或没有,而_snprintf将返回字符数不同。负数如果没有在缓冲区足够的空间

也就是说,分配缓冲区只是足够大的输出,你可以这样做:

int size = snprintf(0, 0, "%s %d\n", str, i); 
char * buffer = malloc(size+1); 
snprintf(buffer, size+1, "%s %d\n", str, i); 

你不能做到这一点与_snprintf为上函数返回的信息是当前大小不够。

11

snprintf()还没有成为微软C运行时开始支持它的标准的一部分。

由于函数原型没有标准化,并且开发人员不想使用名称snprintf(以防标准稍后指定了不同的原型),所以他们选择添加一个前导下划线来表示该函数为Microsoft扩展到标准。

3

添加到上面,

有适当的C99 snprintf()vsnprintf()可用,因为的Visual Studio 2015年

,他们甚至不触发众所周知的不安全功能弃用警告。
_snprintf_s()_vsnprintf_s(),而提供,是的MSVC专用功能“安全变体”,与非C99行为。

0

除了在缓冲区不够大的情况下的不同返回值(在David的回答中描述)之外,来自_sn...组的功能与标准snprintf在另一个重要方面有所不同。如果目标缓冲区是一个字符太短,该_sn...功能考虑这种情况下“成功”。

更详细地,如果目标缓冲器是足够长,以在整个得到的序列存储但没有终止零字符,所述_sn...函数不截断的结果,不写终止零到目标缓冲器和作为结果返回缓冲区的大小。所以,通常情况下,结果不能保证以零终止。

在相同的情况下,snprintf将丢弃所产生的序列的最后一个字符和写在其位0终结。 snprintf的结果始终为零终止。

相关问题