#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
中使用文件路径,那么为什么会改变它。
答案 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
来电。