为什么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()
将它放在那里呢?
答案 0 :(得分:47)
根据C99理由,新行存在是因为现有练习,我认为这与历史原因相同。
Rationale for International Standard — Programming Languages — C§7.23.3.1
asctime
函数虽然此功能的名称暗示与删除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
手册页中,这是一个谜。