2009-10-07 15 views
5

Potrzebuję uzyskać aktualny czas w formacie "HH: MM: SS" do tablicy znaków (ciąg znaków), więc mogę wypisać wynik później prosto z printf("%s", timeString);Czas na ciąg z HH: MM: Format SS (C-programowanie)

Jestem całkiem zdezorientowany na timeval i time_t typów btw, więc wszelkie wyjaśnienie byłoby super :)

EDIT: więc próbowałem z strftime itp, a to trochę pracował. Oto mój kod:

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

Ale wynik jest następujący: "13: 49: 53a? J`aS?"

Co się dzieje z "a? J`aS?" na końcu?

Odpowiedz

8

Dostaniesz śmieci z tego kodu:

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

bo nie jesteś pozwalając przestrzeń dla terminatora null (\ 0) na ciąg, więc gdy ciąg jest drukowany, to nie robi wiedzieć, gdzie jest koniec i dodaje losowe śmieci w następnej części pamięci jako część ciągu.

zmienić go na to:

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

i będzie ona działać prawidłowo, ponieważ strftime() będzie mieć wystarczająco dużo miejsca, aby dodać \ 0. Zwróć uwagę, że używam sizeof (array), aby uniknąć ryzyka zapomnienia o zmianie liczby w obu miejscach.

+0

Ach, oczywiście. Dzięki stary! – o01

+1

Zwykle stosuję podejście pesymistyczne i nadmiernie alokuję rozmiary buforów. Na przykład, zadeklaruję, że 'timeString []' ma być około 20 znaków. Pamięć jest tania, a my mówimy tu tylko o kilka dodatkowych bajtów. I to oszczędza, gdy później zdecydujesz się zmienić ciąg formatu, ale zapomnij zaktualizować długość bufora. –

+0

+1 dla użycia 'sizeof()', aby umożliwić kompilatorowi przekazanie rozmiaru tablicy. –

4

Zapoznaj się z funkcją strftime, która umożliwia wpisanie czasu do tablicy znaków z wybranym formatem.

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

Ważnymi rodzaje postępowania z czasu (typ ściany zegara czasu, a nie proces/czas gwintu) są time_t i struct tm.
Przy niektórych pracach można dokonać konwersji między jednym a drugim, ale należy zwrócić uwagę na czas lokalny i czas UTC.

przestudiuj description of <time.h>, wypróbuj funkcje tam aż ty grok czasu w C

Ponownie, należy zwrócić uwagę na czas UTC i czasem lokalnym.

+0

Czy nie powinniśmy robić, co w naszej mocy, by nie rozmnażać się z użyciem nieodłącznego "sprintf()"? –

+0

Zgadzam się ... ale ... nie w tym fragmencie powyżej ... czy nie powinniśmy robić, co możemy, aby nie rozmnażać się z użyciem nieodłącznie dodawanej liczby całkowitej? – pmg