2015-07-13 65 views
3

我想在Windows上將時間字符串轉換爲C中的時間格式。因爲我在我的字符串中只有小時,分鐘和秒鐘,所以試圖使用sscanf將時間格式解析爲字符串,然後使用mktime。但不知何故,它不會將其轉換爲時間格式。爲了檢查,我試圖將轉換後的時間打印回來。代碼如下:使用sscanf將字符串轉換爲時間

struct tm tm; 
char time_buffer[100]; 
int hh, mm; 
float ms; 
time_t time_value; 
char *timestamp = {"16:11:56.484"}; 
sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ms); 
tm.tm_hour =hh; 
tm.tm_min = mm; 
tm.tm_sec = ms*1000; 
tm.tm_isdst = -1; 
time_value = malloc(100*sizeof(char)); 
time_value = mktime(&tm); 
if (time_value==-1) 
    printf ("unable to make time"); 
strftime(time_buffer, sizeof(time_buffer), "%c", &tm); 
printf(time_buffer); 
+0

使用'malloc'進行堆分配的目的是什麼?這隻會給你一個內存泄漏。 –

+0

我在我的代碼中有一個時間戳值的數組,爲什麼我分配了內存。在這裏我沒有顯示數組來保持簡單的代碼。 – learningpal

+0

如果你有一個'time_t'值的數組,你應該用'sizeof(time_t)'而不是'sizeof(char)'的倍數來分配。 –

回答

1

在致電mktime()之前,代碼需要初始化7個字段tm_struct()year, month,day, hour min, sec, isdst。其他人也可以初始化,但他們被忽略。

年,月,日應設置爲合理的:讓我們使用2000年1月1日。或者代碼可以使用time_t()得到今天。

代碼使用ms暗示該值以毫秒爲單位。不是這樣。它仍然在幾秒鐘內。

使用本地time_t變量而不是分配一個變量。 malloc()不需要。

struct tm tm; 
tm.tm_year = 2000 - 1900; // Years from 1900 
tm.tm_mon = 1 - 1; // Months form January 
tm.tm_mday = 1; 
char time_buffer[100]; 
int hh, mm; 
float ss; 
time_t time_value; 
char *timestamp = "16:11:56.484"; 

if (sscanf(timestamp, "%d:%d:%f", &hh, &mm,&ss) != 3) Handle_BadData(); 
tm.tm_hour = hh; 
tm.tm_min = mm; 
tm.tm_sec = roundf(ss); // or simply = ss; 
tm.tm_isdst = 0; // Keep in standard time 
// time_value = malloc(100*sizeof(char)); 
time_value = mktime(&tm); 
if (time_value == -1) { 
    printf ("unable to make time"); 
} 
else { 
    strftime(time_buffer, sizeof(time_buffer), "%c", &tm); 
    printf(time_buffer); 
} 

// Sat Jan 1 16:11:56 2000 
+0

@ chux:非常感謝。我沒有初始化struct tm的所有變量。但是,我需要幾毫秒的時間值,你能解釋如何以毫秒爲單位獲得這個時間嗎? – learningpal

+1

使用'time_t' - 'time_t'作爲'mktime()'的類型結果,代碼_cannot_以毫秒爲單位可移植地保存時間值。 C沒有指定'time_t'值如何被編碼,而不是它是一個數字。自1970年1月1日以來,大多數(並非全部)都具有'time_t'作爲整數秒數 - 請參見[unix time](https://en.wikipedia.org/wiki/Unix_time)。代碼可以使用自己的結構,也許一個包含'time_t'的字段,另一個包含秒的幾分之一。許多操作系統都使用'typedef struct timeval {long tv_sec; long tv_usec; } timeval;'或類似的東西 - 所以不需要重新發明輪子。 – chux

+1

@learningpal _getting_毫秒值很容易'float ms = modff(ss,NULL)* 1000.0f;'現在代碼有毫秒值,你想用它做什麼? – chux

4
  1. 你不initializestruct tm但只設置tm_hourtm_mintm_sectm_isdst。所有其他字段未初始化,因此具有未知/未定義的值。
  2. 如果您想初始化struct tmmemset(&tm, 0, sizeof(tm)),你會因爲該結構持有的領域並不都讓0作爲有效值(tm_mday)可能仍然收到一個錯誤。請參閱docs以供參考。
  3. 您輸入tm_sec的值可能無效。你實際上希望它是ms/1000,而不是ms*1000
+0

但是不是struct tm已經在time.h中初始化了嗎? – learningpal

+0

它只是**在time.h中定義的**。你聲明變量,所以你必須初始化它。如果你仍然在學習:初始化**你定義的值聲明的每個**變量是個好習慣。 – eckes

+0

@ eckes:非常感謝您的意見。我將它初始化爲:tm.tm_hour = 16; tm.tm_min = 11; tm.tm_sec = 56.484 * 1000;但仍然顯示「無法騰出時間」 – learningpal

相關問題