2

localtime() 関数に入れた異なる引数で 2 つの日付を表示しようとすると、コンソールに 2 つの等しい日付が表示されるのはなぜですか?

これは私のコードです:

#include<stdio.h>
#include<conio.h>
#include<time.h>

int main() {
    time_t time1, time2;
    struct tm *timeinfo1, *timeinfo2;
    char *time1str, *time2str;

    time1 = 3600;
    time2 = 3720;
    timeinfo1 = localtime(&time1);
    timeinfo2 = localtime(&time2);

    time1str = asctime(timeinfo1);
    time2str = asctime(timeinfo2);
    puts(time1str);
    puts(time2str);

    getch();
    return 0;
}
4

4 に答える 4

5

Data wouldn't persist between two calls to localtime or asctime. You have to copy data somewhere. Here is corrected example (still have little issue with strncpy):

#include <stdio.h>
#include <time.h>
#include <string.h>

int main() {
    time_t time1, time2;
    struct tm timeinfo1, timeinfo2, *ti;
    char time1str[256], time2str[256], *tstr;

    time1 = 3600;
    time2 = 3720;
    ti = localtime(&time1);
    memcpy(&timeinfo1, ti, sizeof(*ti));
    ti = localtime(&time2);
    memcpy(&timeinfo2, ti, sizeof(*ti));

    tstr = asctime(&timeinfo1);
    strncpy(time1str, tstr, sizeof(time1str) - 1);
    tstr = asctime(&timeinfo2);
    strncpy(time2str, tstr, sizeof(time1str) - 1);

    puts(time1str);
    puts(time2str);

    return 0;
}
于 2013-10-17T09:20:21.473 に答える
4

localtimeのドキュメントから:

戻り値は、その後の gmtime または localtime の呼び出しによって有効性または値が変更される可能性のある内部オブジェクトを指します。

localtime()同じポインターを 2 回返します: 同じデータで 2 回作業しています。

テスト:

printf("%p\n", localtime(&time1));
printf("%p\n", localtime(&time2));

出力:

0x7f7d9d2eee80
0x7f7d9d2eee80
于 2013-10-17T09:15:55.430 に答える
2

localtime()そしてasctime()それぞれが内部バッファへのポインタを返します。localtime()このバッファは、呼び出されるたびに上書きされるasctime()ため、OP のコードでは、最初の呼び出しの結果が 2 番目の呼び出しの結果に置き換えられます。

異なる時間を印刷するには、呼び出しの順序を次のように並べ替えます。

timeinfo1 = localtime(&time1);
time1str = asctime(timeinfo1);
puts(time1str);

timeinfo2 = localtime(&time2);
time2str = asctime(timeinfo2);
puts(time2str);

POSIX 準拠のシステムを使用している場合は、代わりlocaltime_r()asctime_r()、呼び出し元によって提供されたバッファーを使用します。

#define _POSIX_C_SOURCE 1

#include<stdio.h>
#include<conio.h>
#include<time.h>

int main(void) 
{
  time_t time1 = 3600;
  time_t time2 = 3720;

  struct tm timeinfo1 = {0};      
  struct tm timeinfo2 = {0};

  char time1str[32] = "";
  char time2str[32] = "";

  localtime_r(&time1, &timeinfo1);
  localtime_r(&time2, &timeinfo2);

  asctime_r(&timeinfo1, timestr1);
  asctime_r(&timeinfo2, timestr2);

  puts(time1str);
  puts(time2str);

  getch();

  return 0;
}

timeinfo?変数との宣言が異なることに注意してくださいtime?str

于 2013-10-17T11:19:13.187 に答える