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 时,它只会打印一堆垃圾,例如

当前日期:ÃÃÃ××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);

这使您可以将格式视为一种格式,并且意味着您不必进行所有字符串操作。

另请注意, sprintf 不将最大大小作为参数

于 2012-06-06T15:43:57.080 回答