2012-06-06 13 views
2

我目前正在開發一個c項目,我試圖從系統獲取日期並將其編譯成字符串。在c中建立一個日期字符串

我對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的只是打印的垃圾例如負載

當前日期:AAXA·Z¤ÿ·AAAA©Ã'Ãÿ·^XÃé< 95>úþ·^ F ^發^ P^_

什麼我做錯了嗎?

+0

你有在每個字符串末尾空終止? –

+1

順便說一句,你可能想看看['ctime()'](http://en.cppreference.com/w/c/chrono/ctime)函數 –

+0

,它看起來你有兩個變量'currentDate ',這是不允許 –

回答

9

我會考慮使用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); 
6

將第一個strcat更改爲以下內容。 currentDate否則不會被初始化。

strcpy(currentDate, day); 

但是,使用strftime可能會更簡單。

2
char currentDate[12] = {'\0'}; 

currentDate包含隨機數據且未初始化,因此strcat會查找終止字符串的零。

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的不走maximun大小作爲參數

相關問題