拼图 - 在C中以人类可读的形式打印时间; ctime,asctime

时间:2013-01-17 13:00:59

标签: c ctime time-t

有一个下面的谜题,我认为我知道正确的答案,但我也有一个问题。看看:

Sample Code 
void printTime( time_t *t ) 
{ 
???? 
} 

以下哪一项可以取代????在上面的代码中以人类可读的形式打印t中传递的时间?

  1. char s[ 100 ];
    ctime( t, s ); 
    printf( "%s\n", s ); 
    
  2. printf( "%s\n", ctime( t ) ); 
    
  3. printf( "%s\n", asctime( t ) ); 
    
  4. printf( "%s", t ); 
    
  5. char *s = ctime( t ); 
    printf( "%s\n", s ); 
    free( s ); 
    
  6. 我的回答是答案2(函数ctime将time_t指针作为输入并返回指向字符串的指针,然后可以通过printf打印)。

    答案5的代码在编译时也有效,但为什么我们会在以前没有分配存储时使用free()?你认为这就是为什么答案5是错的吗?

    谢谢你, Przemek

1 个答案:

答案 0 :(得分:3)

  1. 这样做不行,请改用ctime_r
  2. 工作正确。
  3. 错误的类型,您必须先转换它,例如使用localtime
  4. 错误的可变参数类型,char*预期但time_t*已给出。
  5. 不正确的免费,因为ctime管理其缓冲区本身,例如使用静态的。
  6. 一般来说,大多数这些功能(即asctimectimelocaltime,...)现在有两种变体:历史形式,它使用一些静态分配的缓冲区来保存返回值,以及带有_r后缀的更现代的版本,代表可重入。对于后者,您必须自己提供输出缓冲区,这意味着您负责分配它。最大的好处是多个线程可以同时使用可重入版本,而不必担心会覆盖彼此的结果。