2009-10-07 24 views
5

Şu anki zamanı "HH: MM: SS" biçiminde bir karakter dizisine (dize) almam gerekiyor, böylece sonucu daha sonra verebiliyorum sadece printf("%s", timeString);HH: AA: SS biçiminde dize ile zamana dönüş

ile btw timeval ve time_t türlerinde oldukça karıştı, bu nedenle herhangi bir açıklama harika olurdu :)

DÜZENLEME: yüzden strftime vb ile çalıştı ve bu tür çalıştı. İşte benim kodum:

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

Ancak çıktı şudur: "13: 49: 53a ?? J`s?"

Sonunda "a ?? J`aS?" ile neler oluyor?

cevap

8

Bu koddan çöp alıyoruz:

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

Eğer ipteki boş terminatör (\ 0) için yer izin vermekten kaçınmak için, bu yüzden dize o yazdırıldığında, değil Sonun nerede olduğunu bilir ve dizinin bir parçası olarak bir sonraki bellekte rastgele çöpleri işler. Buna

Değişim it:

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

Ve strftime() bir \ 0 eklemek için yeterli alana sahip olacak çünkü düzgün çalışması gerekir. Her iki yerde de sayıyı değiştirmeyi unutma riskini önlemek için sizeof (array) kullanıyorum.

+0

Ah, tabi ki. Tesekkurler dostum! – o01

+1

Genellikle kötümser yaklaşımı ve aşırı ayırma arabellek boyutlarını alırım. Örneğin, timeString [] 'ı 20 veya daha fazla karakter olarak bildiririm. Hafıza ucuz ve sadece birkaç ekstra bayttan bahsediyoruz. Daha sonra format dizisini değiştirmeye karar verdiğinizde ancak arabellek uzunluğunu güncellemeyi unuttuğunuzda sizi kurtarır. Derleyicinin dizinin boyutunu geçmesine izin vermek için, sizeof() 'işlevini kullanmak üzere –

+0

+1. –

4

Saatinizi, istediğiniz bir biçimde bir char dizisine yazmanıza olanak veren strftime işlevine bakı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); 

zaman ile ilgili önemli türleri (zaman duvar saatlik tipi değil, işlem/iplik süresi) time_t ve struct tm bulunmaktadır.
Bazı çalışmalarda, biriyle diğeri arasında geçiş yapabilirsiniz, ancak UTC saatine göre yerel saate dikkat etmelisiniz.

incelemek description of <time.h>, sen Yine

C

yılında zaman grok UTC zamanı ve yerel saate dikkat kadar orada işlevlerini deneyin.

+0

Doğası gereği güvensiz sprintf() 'nin çoğalmasını önlemek için elimizden geleni yapmalı mıyız? –

+0

Ben katılıyorum ... ama ... yukarıdaki pasajda değil ... doğal olarak güvensiz tamsayı ilavesinin kullanımını çoğaltmak için elimizden geleni yapmamalı mıyız? – pmg

İlgili konular