Pourquoi la chaîne renvoyée par ctime () contient-elle un saut de ligne?

Pourquoi la chaîne renvoyée par ctime() a-t-elle un ctime() ligne ( 0x0A ) comme caractère final? Par exemple, ce code:

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

… produit la sortie suivante:

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

Ce n’est pas grave; Je peux retirer le dernier octet de la chaîne, mais pourquoi ctime() met-il en premier lieu?

Selon la justification C99, la nouvelle ligne existe en raison de la pratique existante , ce qui, selon moi, revient à dire pour des raisons historiques.

Justification de la norme internationale – Langages de programmation – C §7.23.3.1 La fonction asctime

Bien que le nom de cette fonction suggère un conflit avec le principe de suppression des dépendances ASCII de la norme, le nom a été conservé en raison de l’état de la technique. Pour la même raison de la pratique existante, une proposition visant à supprimer le caractère de nouvelle ligne du format de chaîne n’a pas été adoptée.

Cela parle d’ asctime , mais puisque ctime est équivalent à asctime(localtime(timer)) , la même règle s’applique.

La norme POSIX affirme une compatibilité historique:

[asctime] est inclus pour la compatibilité avec les anciennes implémentations … Les applications doivent utiliser strftime () pour obtenir une portabilité maximale.

Étant donné qu’il était inclus pour la compatibilité avec les anciennes implémentations, il est raisonnable de supposer qu’une ancienne bibliothèque implémentait asctime avec une nouvelle ligne à la fin.

Ce comportement est requirejs, tel que défini dans la spécification 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 ssortingng 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 ssortingng. It is equivalent to asctime(localtime(timer)) 

Cela pourrait être dû à l’origine à la mise en œuvre du programme de date sous Unix. (Alors peut-être une nouvelle ligne pour le shell)? Donc peut-être pour des raisons historiques.

Si vous voulez votre propre format (un sans la nouvelle ligne), utilisez strftime() place. La chaîne de format "%c" devrait vous donner à peu près le même format mais sans la nouvelle ligne.

La page de asctime() ne mentionne pas (mais ne souligne pas) que la chaîne renvoyée a un caractère de nouvelle ligne avant le caractère nul final. Pourquoi cette information n’est pas également présente dans la page de manuel de ctime est un mystère.