【问题标题】:puzzle - printing time in human-readable form in C; ctime, asctime谜题 - 以 C 语言以人类可读的形式打印时间; ctime, asctime
【发布时间】:2013-01-01 00:43:00
【问题描述】:

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

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 ); 
    

我的答案是答案 2(函数 ctime 将 time_t 指针作为输入并返回指向字符串的指针,然后可以通过 printf 打印该字符串)。

答案 5 的代码在编译后也能正常工作,但为什么在之前没有分配存储空间的情况下我们要使用 free() 呢?你认为这就是答案 5 错误的原因吗?

谢谢你, 普热梅克

【问题讨论】:

  • 存储空间已被ctime(t)分配
  • 注意:它没有被动态分配,所以freeing是错误的。 ctime 使用静态缓冲区(通常所有调用都使用相同的缓冲区)。
  • 这与ctime_r 不同,reentrant(即线程安全)版本,您自己为其提供缓冲区。

标签: c ctime time-t


【解决方案1】:
  1. 这种方式不起作用,请改用ctime_r
  2. 有效且正确。
  3. 类型错误,您必须先转换它,例如使用localtime
  4. 错误的可变参数类型,应为char*,但已给出time_t*
  5. 不正确的空闲,因为ctime 自己管理其缓冲区,例如使用静态的。

一般来说,这些函数中的大多数(即asctimectimelocaltime,......)现在有两种变体:使用一些静态分配的缓冲区来保存返回值的历史形式,以及更现代的版本,带有 _r 后缀,代表 reentrant。对于后者,您必须自己提供输出缓冲区,这意味着您负责分配它。最大的优势是多个线程可以同时使用可重入版本,而不必担心会覆盖彼此的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 2018-02-24
    • 2016-07-05
    • 1970-01-01
    • 2015-03-18
    • 2021-10-23
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多