4

私は現在acプロジェクトに取り組んでおり、システムから日付を取得して文字列に構築しようとしています。

私はcに非常に慣れていないので、現在進行中ですが、これを機能させることができません。以下は私が持っているコードです

time_t now = time(NULL);
struct tm *t = localtime(&now);
char currentDate[13];
char day[3];
char month[3];
char year[5];
char hour[3];
char min[3];
sprintf(day, "%02d", t->tm_mday, sizeof(day));
sprintf(month, "%02d", t->tm_mon+1, sizeof(month));
sprintf(year, "%04d", t->tm_year + 1900, sizeof(year));
sprintf(hour, "%02d", t->tm_hour, sizeof(hour));
sprintf(min, "%02d", t->tm_min, sizeof(min));
strcat(currentDate, day);
strcat(currentDate, month);
strcat(currentDate, year);
strcat(currentDate, hour);
strcat(currentDate, min);
printf("Current Date: %s", currentDate);

printf を実行すると、大量のゴミが出力されるだけです。

現在の日付: ãxâ·Zâ¤ã¿â·ã¸ããâ©ã´ããâ·^Xãã©<95>ãºã¾â·^F^Fã^P^_

私は何を間違っていますか。

4

4 に答える 4

14

ctimeおよび/またはstrftimeの使用を検討します。文字列や時間フィールドをいじりすぎずに、必要なものが得られる場合があります。

strftime を使用:

char text[100];
time_t now = time(NULL);
struct tm *t = localtime(&now);


strftime(text, sizeof(text)-1, "%d %m %Y %H:%M", t);
printf("Current Date: %s", text);
于 2012-06-06T15:44:53.343 に答える
7

最初の strcat を次のように変更します。 currentDateそれ以外の場合は初期化されません。

strcpy(currentDate, day);

ただし、使用する方が簡単かもしれませんstrftime

于 2012-06-06T15:40:02.720 に答える
2
char currentDate[12] = {'\0'};

currentDate にはランダムなデータが含まれており、初期化されていないため、strcat は文字列を終了するゼロを探します。

于 2012-06-06T15:40:42.580 に答える
1

@markWilkinsの答えは正しいですが、文字列を一度に印刷する方が簡単かもしれません。

sprintf(currentDate, "%02d%02d%04d%02d%02d", t->tm_mday, t->tm_mon+1, 
 t->tm_year + 1900, t->tm_hour,t->tm_min);

これにより、フォーマットを 1 つとして見ることができ、すべての文字列操作を行う必要がなくなります。

また、sprintf は最大サイズをパラメーターとして取りません。

于 2012-06-06T15:43:57.080 に答える