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()
が最初にそこに置くのですか?
C99の理論的根拠によると、既存の慣行のために新しい行が存在します。これは、歴史的な理由で言っているのと同じだと思います。
国際標準の理論的根拠—プログラミング言語— C §7.23.3.1
asctime
関数この関数の名前は、標準からASCII依存関係を削除するという原則との矛盾を示唆していますが、先行技術のために名前は保持されました。同じ既存の慣行の理由で、文字列形式から改行文字を削除する提案は採用されませんでした。
これはasctime
について話しますが、ctime
はasctime(localtime(timer))
と同等であるため、同じルールが適用されます。
POSIX標準 は過去の互換性を主張しています:
[asctime]は、古い実装との互換性のために含まれています...アプリケーションは、最大の移植性を実現するためにstrftime()を使用する必要があります。
古い実装との互換性のために含まれていることを考えると、いくつかの古いライブラリは最後に改行を付けてasctime
を実装したと考えるのが妥当です。
この動作は、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))
もともとUnixで日付プログラムを実装する必要があったためかもしれません。 (それで、おそらくシェルの改行)?だから歴史的な理由かもしれません。
独自の形式(改行のない形式)が必要な場合は、代わりにstrftime()
を使用してください。フォーマット文字列"%c"
はほぼ同じ形式になりますが、改行はありません。
asctime()
のマニュアルページには、返された文字列の末尾のnull文字の前に末尾の改行文字があることが記載されています(ただし強調されていません)。この情報がctime
のマニュアルページにも存在しない理由は謎です。