作为一名c语言开发者,肯定用过snprintf函数,但是,你真的了解snprintf吗? 废话不多说,直接看代码,尝试写出printf的输出结果。
#include
#include
int main(void)
{
int slen = 0;
char str[5] = {
0};
char hstr[6] = {
'h', 'e', 'l', 'l', 'o', 0};
slen = snprintf(str, sizeof(str), "%s", hstr);
printf("str:%s, strlen(str) = %lu, slen = %d.\n",
str, strlen(str), slen);
return 0;
}
输出结果最后再揭晓,先来说下snprintf,他两个关键点,理解了,你才能说你真正会用snprintf。
snprintf函数原型:
int snprintf(char *str, size_t size, const char *format, ...);
- size参数的含义: size表示可以向str输出的最大字符串长度,这里包括字符串结尾符‘\0’(注意:‘\0’是自动添加的,不管后面的自字符串是否包含’\0’),即,可以输出到str的有效字符的大小为:size - 1;
- 返回值: snprintf的返回值是期望输出到str缓存区的字符串长度,注意:1)是期望,不是实际输出到str字符的长度,字符串可能会被截断;2)不包括’\0’。所以,如果是连续往一个缓存中输出字符串,每次函数返回之后,需要用snprintf的返回值、之前输出的字符长度之和与缓存的长度进行比较,以免出现缓存overflow!
好了,就说这多,下面说下程序的输出结果:
str:hell, strlen(str) = 4, slen = 5.
惊不惊喜,意不意外,是不是和自己之前想的有点不太一样呢?其实,理解了上面说的两点,这个结果并不意外!
最后,说一点,在进行字符串格式化输出到缓存的操作时,must使用snprintf,禁止使用“sprintf,否则,overflow会在一个意想不到的地方冒出来,搞得你直接崩溃::。