2009-10-07 11 views
5

je dois obtenir l'heure actuelle dans un « HH: MM: SS » -format dans un tableau de caractères (string) afin que je puisse sortir le résultat plus tard simplement avec un printf("%s", timeString);temps en chaîne avec HH: MM: SS (C-programmation)

Je suis assez confus sur les timeval et time_t types btw, de sorte que toute explication serait génial :)

EDIT: Je essayé avec strftime etc, et un peu travaillé. Voici mon code:

time_t current_time; 
struct tm * time_info; 
char timeString[8]; 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, 8, "%H:%M:%S", time_info); 
puts(timeString); 

Mais la sortie est la suivante: "13: 49: 53a ?? J`aS?" Que se passe-t-il avec "a ?? J`aS?" à la fin?

Répondre

8

Vous obtenez des ordures de ce code:

time_t current_time; 
struct tm * time_info; 
char timeString[8]; 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, 8, "%H:%M:%S", time_info); 
puts(timeString); 

Parce que vous ne permettez pas d'espace pour une terminaison null (\ 0) sur la chaîne, alors quand la chaîne il imprimé, il ne savoir où est la fin et inteprets les déchets aléatoires dans le prochain bit de la mémoire dans le cadre de la chaîne.

Modifier à ceci:

time_t current_time; 
struct tm * time_info; 
char timeString[9]; // space for "HH:MM:SS\0" 

time(&current_time); 
time_info = localtime(&current_time); 

strftime(timeString, sizeof(timeString), "%H:%M:%S", time_info); 
puts(timeString); 

Et ça va fonctionner correctement parce que strftime() aura assez d'espace pour ajouter un \ 0. Notez que j'utilise sizeof (array) pour éviter le risque d'oublier de changer le nombre aux deux endroits.

+0

Ah, bien sûr. Merci mec! – o01

+1

Je prends généralement l'approche pessimiste et sur-allouer les tailles de tampon. Par exemple, je déclare 'timeString []' à 20 caractères ou plus. La mémoire est bon marché, et nous ne parlons ici que de quelques octets supplémentaires. Et il vous sauve quand vous décidez plus tard de changer la chaîne de format mais oubliez de mettre à jour la longueur de mémoire tampon. –

+0

+1 pour l'utilisation de 'sizeof()' pour laisser le compilateur passer la taille du tableau. –

4

Jetez un oeil à la fonction strftime, qui vous permet d'écrire le temps dans un tableau de caractères avec un format de votre choix.

2
#include <stdio.h> 
#include <time.h> 

/* get seconds since the Epoch */ 
time_t secs = time(0); 

/* convert to localtime */ 
struct tm *local = localtime(&secs); 

/* and set the string */ 
sprintf(timeString, "%02d:%02d:%02d", local->tm_hour, local->tm_min, local->tm_sec); 

Les types importants pour traiter dans le temps (le type de temps, non processus/Délai de fil paroi d'horloge) sont time_tstruct tm et.
Avec un peu de travail, vous pouvez convertir entre un et l'autre, mais vous devez faire attention à l'heure locale par rapport à l'heure UTC.

Peruse le description of <time.h>, essayez les fonctions jusqu'à ce que vous GROK temps en C.

Encore une fois, faites attention à l'heure UTC et l'heure locale.

+0

On ne devrait pas faire ce que nous pouvons pour ne pas proliférer l'utilisation de l'insécurité inhérente 'sprintf()'? –

+0

Je suis d'accord un peu ... mais ... pas dans l'extrait ci-dessus ... nous ne devrions pas faire ce que nous pouvons pour ne pas proliférer l'utilisation de l'ajout entier intrinsèquement non sécurisé? – pmg

Questions connexes