sprintf的奇怪工作

时间:2013-04-30 05:03:40

标签: c printf

#include<stdio.h>
#include<time.h>
int main(){
  char filepath[100];
  char datevar[15];
  char command[30];
  struct tm *t1;
  time_t now ;
  time(&now);
  memcpy(&t1,localtime(&now),sizeof(t1));
  t1 = localtime(&now);
  memset(filepath,0,sizeof(filepath));
  sprintf(datevar,"%04d%02d%02d",t1->tm_year+1900,t1->tm_mon+1,t1->tm_mday);
  strcpy(filepath,"abc");
  strcat(filepath,"/xyx/");
  strcat(filepath,datevar);
  strcat(filepath,"/");
  printf("filepath  1:- %s\n",filepath);
  sprintf(command, "hello %s good path",filepath);
  printf("filepath  2:- %s\n",filepath);
  return 0;
}

在上述程序中,printf都打印了不同的filepath。 我得到的输出: -

filepath  1:- abc/xyx/20130430/
filepath  2:- h

我的问题是,如果我在sprintf中使用文件路径,那么为什么会改变它。

2 个答案:

答案 0 :(得分:6)

这是因为

char command[30];

不足以容纳

sprintf(command, "hello %s good path",filepath);

看起来最终的'h'和0-terminator进入filepath. (Which is coincidental, since sprintf ing more into命令,而不是它可以调用未定义的行为。)

答案 1 :(得分:3)

与此问题无关,但您有一个更严重的问题,就是这样:

memcpy(&t1,localtime(&now),sizeof(t1));

在这里你使用&t1,它取指针的地址,这意味着你传递给指向memset的指针的struct tm,换句话说struct tm ** 。您还使用sizeof(t1)这是指针的大小而不是它可能指向的大小,并且根据平台它将是四个或八个字节。

因为你之后直接做

t1 = localtime(&now);

实际上并不需要memset来电。