Подтвердить что ты не робот

Почему строка, возвращаемая 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() поместить его туда в первую очередь?

4b9b3361

Ответ 1

В соответствии с Обоснованием C99, новая линия существует из-за существующей практики, которая, я думаю, такая же, как и по историческим причинам.

Обоснование для международного стандарта - Языки программирования - C §7.23.3.1 Функция asctime

Хотя название этой функции предполагает конфликт с принципом удаления ASCII зависимостей от Стандарта, имя было сохранено из-за предшествующего уровня техники. По той же причине, что и существующая практика, предложение об удалении символа новой строки из формата строки не было принято.

Это говорит о asctime, но поскольку ctime эквивалентно asctime(localtime(timer)), то применяется то же правило.

Ответ 2

POSIX Standard утверждает историческую совместимость:

[asctime] включен для совместимости со старыми реализациями... Приложения должны использовать strftime() для достижения максимальной переносимости.

Учитывая, что он был включен для совместимости со старыми реализациями, разумно предположить, что некоторая более старая библиотека реализовала asctime с новой строкой в ​​конце

Ответ 3

Это поведение требуется, как определено в спецификации 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

Это может быть потому, что изначально было необходимо выполнить дату программы в Unix. (Может быть, новая строка для оболочки)? Поэтому по историческим причинам.

Ответ 5

Если вам нужен собственный формат (один без новой строки), используйте strftime(). Строка формата "%c" должна содержать примерно тот же формат, но без новой строки.

Ответ 6

В man-странице asctime() упоминается (но не подчеркивается), что возвращаемая строка имеет завершающий символ новой строки перед завершающим нулевым символом. Почему эта информация не присутствует на странице ctime, является загадкой.