2009-10-07 22 views
5

Necesito obtener la hora actual en un formato "HH: MM: SS" en una matriz de caracteres (cadena) para que pueda dar salida al resultado más tarde simplemente con un printf("%s", timeString);Tiempo en cadena con formato HH: MM: SS (programación C)

estoy bastante confusa en los timeval y time_t tipos cierto, por lo que cualquier explicación sería impresionante :)

EDIT: así que traté con strftime etc, y poco trabajado. Aquí está mi código:

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); 

Pero el resultado es este: "13: 49: 53a? J`aS?"

¿Qué está pasando con "a ?? J`aS?" al final?

Respuesta

8

Usted está recibiendo la basura de este código:

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); 

Debido a que usted no está dejando espacio para un terminador nulo (\ 0) en la cadena, por lo que cuando la cadena se imprime, no lo hace saber dónde está el final e interpreta basura al azar en el siguiente bit de memoria como parte de la cadena.

Cambio a esto:

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); 

Y va a trabajar correctamente porque strftime() tendrá espacio suficiente para añadir un \ 0. Tenga en cuenta que estoy usando sizeof (array) para evitar el riesgo de olvidarme de cambiar el número en ambos lugares.

+0

Ah, por supuesto. Gracias amigo! – o01

+1

Por lo general, tomo el enfoque pesimista y asignar demasiados tamaños de búfer. Por ejemplo, declararía que 'timeString []' tiene 20 o más caracteres. La memoria es barata, y solo estamos hablando de algunos bytes adicionales aquí. Y lo guarda cuando más tarde decide cambiar la cadena de formato, pero se olvida de actualizar la longitud del búfer. –

+0

+1 para el uso de 'sizeof()' para permitir que el compilador pase el tamaño de la matriz. –

4

Eche un vistazo a la función strftime, que le permite escribir la hora en una matriz de caracteres con un formato de su elección.

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); 

Los tipos importantes para hacer frente con el tiempo (el tipo de pared reloj de tiempo, no proceso/hora hilo) son time_t y struct tm.
Con algo de trabajo puede convertir entre uno y otro, pero debe prestar atención a la hora local frente a la hora UTC.

buscar por los description of <time.h>, probar las funciones allí hasta que grok vez en C.

Una vez más, se presta atención a la hora UTC y la hora local.

+0

¿No deberíamos hacer lo que podamos para no proliferar el uso del 'sprintf()' intrínsecamente inseguro? –

+0

Estoy un poco de acuerdo ... pero ... no en el fragmento de arriba ... ¿no deberíamos hacer lo que podamos para no proliferar el uso de la adición de enteros inherentemente inseguros? – pmg

Cuestiones relacionadas