¿Por qué la cadena devuelta por ctime() contiene una línea de alimentación?


¿Por qué la cadena devuelta por ctime() tiene un feed de línea (0x0A) como su carácter final? Por ejemplo, este código:

#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;
}

...produce la siguiente salida:

$ ./time.exe
Wed Oct 23 14:52:29 2013
why is this on a new line?
$ 

No es un gran problema; puedo quitar el byte final de la cadena, pero ¿por qué ctime() lo pone allí en primer lugar?

Author: Yu Hao, 2013-10-23

6 answers

De acuerdo con la Justificación de C99, la nueva línea existe debido a la práctica existente, que creo que es lo mismo que decir por razones históricas.

Rationale for International Standard-Programming Languages-C §7.23.3.1 La función asctime

Aunque el nombre de esta función sugiere un conflicto con el principio de eliminar ASCII dependencias del Estándar, el nombre fue retenido debido al estado de la técnica. Por la misma razón de la práctica existente, una propuesta para eliminar el carácter de nueva línea del formato de cadena no fue adoptada.

Esto habla de asctime, pero dado que ctime es equivalente a asctime(localtime(timer)), se aplica la misma regla.

 47
Author: Yu Hao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 14:26:51

El Estándar POSIX reclama compatibilidad histórica:

[asctime] se incluye para la compatibilidad con implementaciones anteriores ... Las aplicaciones deben usar strftime () para lograr la máxima portabilidad.

Dado que se incluyó por compatibilidad con implementaciones anteriores, es razonable suponer que alguna biblioteca anterior implementó asctime con una nueva línea al final

 8
Author: SheetJS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 14:20:17

Este comportamiento es obligatorio según se define en la especificación 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
Author: Delan Azabani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 14:10:42

Podría ser porque originalmente se requería implementar la fecha programa en Unix. (Así que tal vez una nueva línea para la cáscara)? Así que por razones históricas tal vez.

 4
Author: Sadique,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 14:16:19

Si desea su propio formato (uno sin la nueva línea), use strftime() en su lugar. La cadena de formato "%c" debería darle aproximadamente el mismo formato pero sin la nueva línea.

 3
Author: Sneftel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-23 14:11:27

La página de manual de asctime() menciona (pero no enfatiza) que la cadena devuelta tiene un carácter de nueva línea de terminación antes del carácter null de terminación. Por qué esta información no está también presente en la página man de ctime es un misterio.

 0
Author: JamesU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 01:52:33