您的位置首页百科问答

snprintf,vsnprintf函数用法以及返回值的一个坑

snprintf,vsnprintf函数用法以及返回值的一个坑

的有关信息介绍如下:

snprintf,vsnprintf函数用法以及返回值的一个坑

c语言中经常用snprintf,vsnprintf等函数输出格式化内容到一个字符数组中,本篇经验介绍snprintf函数的用法,以及该函数返回值的用法。其中snprintf函数的返回值不注意的话可能会引起不小的麻烦。

snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...),作用是:将可变参数 “…” 按照format的格式格式化为字符串,输出到str中。

函数的用法如下图:

相比sprintf,snprintf函数多了第二个参数size_t size。这样,当格式化字符串长度大于等于size大小时,snprintf函数也只会写入size-1个字符串。

所以,snprintf函数可以防止内存溢出。

如下图所示,通常第二个参数取目标字符数组的大小,这样可确保不会内存溢出。当只有8个字节时,输出“Hello,w"7个字符。

snprintf函数的返回值是一个int整型。一般我们都没有太关注这个返回值,所以一般不会在意它出现问题。

其实,snprintf函数的返回值:成功时返回源串的长度(strlen, 不含'\0'),失败时返回负值。

特别对于其返回值,因为关注少,所以在项目中可能会出现问题。我们想当然的认为这个返回值是本次写入的字符数,这样多次输出时按这个大小移位。

其实理解了返回值是源字符串的大小就知道,这会产生严重的问题。

如下面的错误代码:

对于上面的例子,正确用法应该是每次输出后重新获取字符数组的长度。然后在输出,如下图正确的代码: