2009-10-07 8 views
5

Tôi cần lấy thời gian hiện tại theo dạng "HH: MM: SS" thành mảng ký tự (chuỗi) để tôi có thể xuất kết quả sau đơn giản với một printf("%s", timeString);Thời gian thành chuỗi với HH: Định dạng MM: SS (lập trình C)

tôi khá bối rối trên timevaltime_t loại btw, vì vậy bất kỳ lời giải thích sẽ là tuyệt vời :)

EDIT: vì vậy, tôi cố gắng với strftime vv, và nó kinda làm việc. Đây là mã của tôi:

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

Nhưng đầu ra là: "13: 49: 53a ?? J`aS?"

Điều gì đang diễn ra với "a ?? J`aS?" ở cuối?

Trả lời

8

Bạn đang nhận rác từ mã này:

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

Bởi vì bạn không cho phép không gian cho một terminator null (\ 0) trên chuỗi, vì vậy khi chuỗi nó in, nó không biết nơi kết thúc là và inteprets rác ngẫu nhiên trong bit tiếp theo của bộ nhớ như là một phần của chuỗi.

Thay đổi nó như thế này:

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

Và nó sẽ làm việc một cách chính xác bởi vì strftime() sẽ có đủ không gian để thêm một \ 0. Lưu ý rằng tôi đang sử dụng sizeof (mảng) để tránh rủi ro quên thay đổi số ở cả hai nơi.

+0

Ah, tất nhiên rồi. Cảm ơn anh bạn! – o01

+1

Tôi thường sử dụng phương pháp bi quan và phân bổ kích thước bộ đệm quá mức. Ví dụ, tôi muốn khai báo 'timeString []' thành 20 ký tự. Bộ nhớ rẻ và chúng tôi chỉ nói thêm vài byte ở đây. Và nó giúp bạn tiết kiệm khi bạn quyết định thay đổi chuỗi định dạng nhưng quên cập nhật độ dài bộ đệm. –

+0

+1 để sử dụng 'sizeof()' để cho trình biên dịch vượt qua kích thước của mảng. –

4

Hãy xem chức năng strftime, cho phép bạn ghi thời gian vào mảng char với định dạng bạn chọ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); 

Các loại quan trọng để đối phó với thời gian (loại tường đồng hồ thời gian, chứ không phải quá trình/thời gian thread) là time_tstruct tm.
Với một số công việc bạn có thể chuyển đổi giữa cái này và cái khác, nhưng bạn phải chú ý đến giờ địa phương so với giờ UTC.

lướt qua description of <time.h>, hãy thử các chức năng đó cho đến khi bạn grok thời gian trong C.

Một lần nữa, chú ý đến thời gian UTC và giờ địa phương.

+0

Chúng ta không nên làm những gì chúng ta có thể để không sinh sôi nảy nở sử dụng 'sprintf()' vốn không an toàn vốn có? –

+0

Tôi đồng ý ... nhưng ... không phải trong đoạn trên ... chúng ta không nên làm những gì chúng ta có thể để không phát triển việc sử dụng số nguyên vốn không an toàn không? – pmg