51

为什么返回的字符串ctime()有一个换行符(0x0A)作为它的最后一个字符?例如,这段代码:

#include <iostream>
#include <cstdlib>

int main(int argc, char* argv[])
{
    time_t now;
    time(&now);
    char* time_str = ctime(&now);
    std::cout << time_str << "why is this on a new line?" << std::endl;
    return 0;
}

...产生以下输出:

$ ./time.exe
Wed Oct 23 14:52:29 2013
why is this on a new line?
$ 

没什么大不了的; 我可以从字符串中删除最后一个字节,但为什么ctime()要把它放在首位呢?

4

6 回答 6

48

根据C99的基本原理,新线路的存在是因为现有的实践,我认为这与历史原因是一样的。

国际标准的基本原理 - 编程语言 - C §7.23.3.1asctime函数

尽管此函数的名称暗示与从标准中删除 ASCII 依赖项的原则相冲突,但由于现有技术而保留了该名称。出于与现有做法相同的原因,没有采用从字符串格式中删除换行符的建议。

这谈到asctime,但由于ctime等同于asctime(localtime(timer)),所以同样的规则适用。

于 2013-10-23T14:15:09.953 回答
8

POSIX 标准声称具有历史兼容性:

包含 [asctime] 是为了与旧实现兼容...应用程序应使用 strftime() 来实现最大的可移植性。

鉴于包含它是为了与旧实现兼容,因此可以合理地假设某些旧库asctime在末尾使用换行符实现

于 2013-10-23T14:20:17.103 回答
4

按照 ISO 9899:1990 规范中的定义,此行为是必需的。

7.12.3.1 The asctime function

The asctime function converts the broken-down time in the structure
pointed to by timeptr into a string in the form

         Sun Sep 16 01:03:52 1973\n\0

7.12.3.2 The ctime function

The ctime function converts the calendar time pointed to by timer to
local time in the form of a string.  It is equivalent to 

         asctime(localtime(timer))
于 2013-10-23T14:10:42.553 回答
4

可能是因为最初需要在 Unix 中实现日期程序。(所以也许是外壳的换行符)?所以也许是出于历史原因。

于 2013-10-23T14:16:19.210 回答
3

如果您想要自己的格式(没有换行符的格式),请strftime()改用。格式字符串"%c"应该为您提供大致相同的格式,但没有换行符。

于 2013-10-23T14:11:27.627 回答
0

asctime()手册页确实提到(但不强调)返回的字符串在终止空字符之前有一个终止换行符。为什么这些信息也没有出现在ctime手册页中是一个谜。

于 2014-09-18T01:06:29.057 回答