2

プログラムのタイムスタンプを作成しようとしています。私の妹の Mac (Xcode 4.2 を使用) では、このコードは問題なく動作します。

struct tm * timeInfo;
time_t rawtime;
time (&rawtime);
timeInfo = localtime (&rawtime);
string timestamp(asctime(timeInfo));

しかし、Visual Studio 2012 を実行している PC では、localtime と asctime のエラーが表示され、安全でない関数であることがわかり、localtime_s と asctime_s の使用が推奨されます。ただし、関数のパラメーターは異なります。できる限り機能を調べてみましたが、機能させることができません。

それを機能させるための助けをいただければ幸いです。

編集:

struct tm * timeInfo;
time_t rawtime;
time (&rawtime);
timeInfo = localtime_s (&rawtime);
string timestamp(asctime_s(timeInfo));
4

1 に答える 1

4

これらの関数のパラメーターが異なる理由は、パラメーターが 1 つしかないために安全性の欠如が引き起こされるためです。特に、asctime()単一のバッファを使用して時間を返します。したがって、次のようなことをすると:

char *s1 = asctime((time_t)0);   // 1-Jan-1970 00:00:00 or something like that. 
time_t t = time();
char *s2 = asctime(t);
cout << "1970: " << s1 << " now:" << s2 << endl;

すると、2 つの異なる時刻が表示されることはありませんが、現在の時刻が 2 回表示され、同じ文字列s1s2指す と の両方が示されます。

同じことが にも当てはまりlocaltime、これは - へのポインターを返しますが、struct tm常に同じstruct tmなので、次のようにします。

struct tm* t1 = localtime(0);
struct tm* t2 = localtime(time()); 

t1andで同じ値が得られますt2(1970年ではなく「現在の」時間で)。

したがって、この問題を解決するにasctime_slocaltime_s、データを格納するために使用される追加のパラメーターを用意します。asctime_sまた、ストレージ バッファにどれだけのスペースがあるかを関数に伝えるための 2 番目の追加パラメータもあります。そうしないと、そのバッファがオーバーフローする可能性があります。

于 2013-07-31T23:12:37.490 に答える