2015-07-13 21 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

相关问题