2013-01-17 4 views
1

Il y a un puzzle suivant auquel je pense connaître la bonne réponse mais j'ai aussi un problème. Jetez un oeil:puzzle - temps d'impression sous forme lisible par l'homme en C; ctime, asctime

Sample Code 
void printTime(time_t *t) 
{ 
???? 
} 

Lequel des éléments suivants peut remplacer le ???? dans le code ci-dessus pour imprimer le temps passé en t sous une forme lisible par l'homme?

  1. :

    char s[ 100 ]; 
    ctime(t, s); 
    printf("%s\n", s); 
    
  2. :

    printf("%s\n", ctime(t)); 
    
  3. :

    printf("%s\n", asctime(t)); 
    
  4. :

    printf("%s", t); 
    
  5. :

    char *s = ctime(t); 
    printf("%s\n", s); 
    free(s); 
    

Ma réponse est la réponse 2 (fonction ctime prend un pointeur time_t en entrée et renvoie un pointeur vers une chaîne de caractères qui peut être imprimée puis par printf).

Le code de la réponse 5 fonctionne aussi bien lors de la compilation, mais pourquoi utiliserons-nous free() si aucun stockage n'a été précédemment alloué? Pensez-vous que c'est la raison pour laquelle la réponse 5 est fausse?

Merci, Przemek

+0

d'entreposage est prévu par ctime (t) ' – Eregrith

+3

Note: il n'a pas été allouée dynamiquement * *, donc' free'ing est faux. 'ctime' utilise un tampon statique (généralement le même pour tous les appels). –

+1

Ce qui est en contraste avec 'ctime_r', le * * rentrante (à savoir thread-safe) version pour laquelle vous fournissez vous-même tampon. – MvG

Répondre

3
  1. Ne fonctionne pas de cette façon, utilisez ctime_r à la place.
  2. Fonctionne et est correcte.
  3. Mauvais type, vous devez le convertir en premier, par ex. en utilisant localtime.
  4. Mauvais type variadique, char* attendu mais time_t* donné.
  5. Incorrect, car ctime gère son tampon lui-même, par ex. en utilisant un statique.

En général, la plupart de ces fonctions (c.-à-asctime, ctime, localtime, ...) sont disponibles en deux variantes de ces jours-ci: la forme historique qui utilise une mémoire tampon allouée statiquement pour maintenir la valeur de retour, et une version plus moderne avec un suffixe _r qui correspond à réentrant. Pour ce dernier, vous devez fournir le tampon de sortie vous-même, ce qui signifie que vous êtes responsable de l'allocation. Le grand avantage est que plusieurs threads peuvent utiliser simultanément les versions réentrantes sans craindre d'écraser les résultats des autres.

+0

Merci beaucoup! Vous l'avez expliqué très clairement. – Prz3m3k

Questions connexes