0
#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

4

2 に答える 2

6

その理由は

char command[30];

収容するのに十分な大きさではない

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

'h'ファイナルと 0 ターミネータがfilepath. (Which is coincidental, sincesprintf ing more intocommand` に入り、それが保持できるよりも未定義の動作を呼び出すように見えます。)

于 2013-04-30T05:06:49.250 に答える
3

この問題とは関係ありませんが、さらに深刻な問題があり、それは次のとおりです。

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

ここでは、ポインタのアドレスを取得する を使用します。これは、ポインタへのポインタへのポインタ、つまり&t1へのポインタに渡すことを意味します。また、ポインタのサイズではなく、ポインタのサイズを使用します。プラットフォームによっては、4 バイトまたは 8 バイトになります。memsetstruct tmstruct tm **sizeof(t1)

あなたはすぐ後にするので

t1 = localtime(&now);

memset電話は実際には必要ありません。

于 2013-04-30T05:10:20.413 に答える