web-dev-qa-db-ja.com

ctime()によって返される文字列に改行が含まれているのはなぜですか?

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()が最初にそこに置くのですか?

50
bythescruff

C99の理論的根拠によると、既存の慣行のために新しい行が存在します。これは、歴史的な理由で言っているのと同じだと思います。

国際標準の理論的根拠—プログラミング言語— C §7.23.3.1asctime関数

この関数の名前は、標準からASCII依存関係を削除するという原則との矛盾を示唆していますが、先行技術のために名前は保持されました。同じ既存の慣行の理由で、文字列形式から改行文字を削除する提案は採用されませんでした。

これはasctimeについて話しますが、ctimeasctime(localtime(timer))と同等であるため、同じルールが適用されます。

47
Yu Hao

POSIX標準 は過去の互換性を主張しています:

[asctime]は、古い実装との互換性のために含まれています...アプリケーションは、最大の移植性を実現するためにstrftime()を使用する必要があります。

古い実装との互換性のために含まれていることを考えると、いくつかの古いライブラリは最後に改行を付けてasctimeを実装したと考えるのが妥当です。

8
SheetJS

この動作は、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))
4
Delan Azabani

もともとUnixで日付プログラムを実装する必要があったためかもしれません。 (それで、おそらくシェルの改行)?だから歴史的な理由かもしれません。

4
Sadique

独自の形式(改行のない形式)が必要な場合は、代わりにstrftime()を使用してください。フォーマット文字列"%c"はほぼ同じ形式になりますが、改行はありません。

3
Sneftel

asctime()のマニュアルページには、返された文字列の末尾のnull文字の前に末尾の改行文字があることが記載されています(ただし強調されていません)。この情報がctimeのマニュアルページにも存在しない理由は謎です。

0
JamesU