50 votes

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

Pourquoi la chaîne retournée par ctime() ont un saut de ligne ( 0x0A ) comme personnage final ? Par exemple, ce code :

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

...produit le résultat suivant :

$ ./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 de caractères, mais pourquoi est-ce que ctime() l'a mis là en premier lieu ?

47voto

Yu Hao Points 40603

Selon la justification du C99, la nouvelle ligne existe pour les raisons suivantes pratique existante ce qui revient à dire que c'est pour des raisons historiques.

Justification de la Norme internationale - Langages de programmation - C §7.23.3.1 Le asctime fonction

Bien que le nom de cette fonction suggère un conflit avec le principe de suppression de l'ASCII de la norme, le nom a été conservé en raison de l'art antérieur. Pour la même raison de 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 de asctime mais comme ctime est équivalent à asctime(localtime(timer)) La même règle s'applique donc.

8voto

Nirk Points 9999

El Norme POSIX revendique la compatibilité historique :

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

Étant donné qu'il a été inclus pour la compatibilité avec des implémentations plus anciennes, il est raisonnable de supposer qu'une bibliothèque plus ancienne a implémenté asctime avec une nouvelle ligne à la fin

4voto

Delan Azabani Points 33013

Ce comportement est requis 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 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))

4voto

al-Acme Points 11571

Cela pourrait être dû au fait qu'à l'origine il était nécessaire de mettre en œuvre la date dans Unix. (Donc peut-être une nouvelle ligne pour le shell) ? Pour des raisons historiques peut-être.

3voto

Sneftel Points 10929

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X