为什么sprintf再次在char数组之前追加字符?

时间:2018-08-18 01:10:23

标签: c

int main () {

  char str1[121];

  char str2[4];
  unsigned char x=255;
  unsigned char y=2;
  memset(str1, 0, 121);
  memset(str2, 0, 4);

  strncpy(str2, "jyot",4);

  sprintf(str1,"%d-%d-%s", x,y,str2);
  printf("%s",str1);

   return(0);
}

为什么打印255-2-jyot-255-2?写入最后一个char数组后,sprintf是否应该自动不追加空字符?

1 个答案:

答案 0 :(得分:2)

您很幸运,计算机在必须运行此代码时没有爆炸。

此程序是一个庞大的UB。您的str2太短。即使您复制(仅使用strncpy 4个char,数组也没有足够的空间容纳尾随零,并且strncpy也不会复制最后一个零。

将其更改为:

char str2[5];
strcpy(str2, "jyot");

并删除memset呼叫,因为此处不需要。

不要忽略警告!!!!并使用更现代的标准进行编译,该标准不允许调用没有原型的函数