为什么ctime()返回的字符串包含换行符?

时间:2013-10-23 14:06:36

标签: c++ c string time std

为什么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()将它放在那里呢?

6 个答案:

答案 0 :(得分:47)

根据C99理由,新行存在是因为现有练习,我认为这与历史原因相同。

  

Rationale for International Standard — Programming Languages — C§7.23.3.1asctime函数

     

虽然此功能的名称暗示与删除ASCII的原则相冲突   来自标准的依赖性,由于现有技术,该名称被保留。 出于与现有做法相同的原因,未采用从字符串格式中删除换行符的提案。

这涉及asctime,但由于ctime相当于asctime(localtime(timer)),因此适用相同的规则。

答案 1 :(得分:8)

POSIX Standard声明了历史兼容性:

  包含

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

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

答案 2 :(得分: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))

答案 3 :(得分:4)

可能是因为最初需要实施日期 Unix中的程序。 (那么可能是shell的换行符)?所以出于历史原因可能。

答案 4 :(得分:3)

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

答案 5 :(得分:0)

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