菜鸟笔记
提升您的技术认知

c语言基础|你真的了解snprintf吗?-ag真人游戏

作为一名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, ...);
  1. size参数的含义: size表示可以向str输出的最大字符串长度,这里包括字符串结尾符‘\0’(注意:‘\0’是自动添加的,不管后面的自字符串是否包含’\0’),即,可以输出到str的有效字符的大小为:size - 1;
  2. 返回值: snprintf的返回值是期望输出到str缓存区的字符串长度,注意:1)是期望,不是实际输出到str字符的长度,字符串可能会被截断;2)不包括’\0’。所以,如果是连续往一个缓存中输出字符串,每次函数返回之后,需要用snprintf的返回值、之前输出的字符长度之和与缓存的长度进行比较,以免出现缓存overflow

好了,就说这多,下面说下程序的输出结果:

str:hell, strlen(str) = 4, slen = 5.

惊不惊喜,意不意外,是不是和自己之前想的有点不太一样呢?其实,理解了上面说的两点,这个结果并不意外!

最后,说一点,在进行字符串格式化输出到缓存的操作时,must使用snprintf,禁止使用“sprintf,否则,overflow会在一个意想不到的地方冒出来,搞得你直接崩溃::。

网站地图