2009-10-07 17 views
5

मुझे वर्तमान समय "एचएच: एमएम: एसएस" -फॉर्मैट में एक वर्ण सरणी (स्ट्रिंग) में प्राप्त करने की आवश्यकता है ताकि मैं बाद में परिणाम आउटपुट कर सकूं बस एक printf("%s", timeString);एचएच के साथ स्ट्रिंग में समय: एमएम: एसएस प्रारूप (सी प्रोग्रामिंग)

साथ मैं बहुत btw timeval और time_t प्रकार पर उलझन में हूँ, इसलिए किसी भी स्पष्टीकरण भयानक होगा :)

संपादित करें: तो मैं strftime आदि के साथ की कोशिश की, और यह थोड़े काम किया। यहाँ मेरी कोड है:

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

लेकिन उत्पादन यह है: "13: 49:? 53a ?? J`aS"

"ए ?? जे`एएस?" अंत में क्या चल रहा है?

उत्तर

8

आप इस कोड से कचरा हो रही है:

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

क्योंकि आप स्ट्रिंग पर एक अशक्त टर्मिनेटर (\ 0) के लिए जगह की अनुमति नहीं दे रहे हैं, ताकि जब स्ट्रिंग यह मुद्रित, यदि ऐसा नहीं होता स्ट्रिंग के हिस्से के रूप में स्मृति के अगले बिट में यादृच्छिक कचरा कहां है और अंतःक्रिया करता है।

यह यह करने के लिए परिवर्तित करें:

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

और इसे सही ढंग से काम करेंगे क्योंकि strftime() एक \ 0 जोड़ने के लिए पर्याप्त स्थान होगा। ध्यान दें कि मैं दोनों जगहों में संख्या को बदलने के लिए भूलने वाले जोखिम से बचने के लिए आकार (सरणी) का उपयोग कर रहा हूं।

+0

आह, ज़ाहिर है। धन्यवाद दोस्त! – o01

+1

मैं आमतौर पर निराशावादी दृष्टिकोण लेता हूं और बफर आकारों को आवंटित करता हूं। उदाहरण के लिए, मैं 'टाइमस्ट्रिंग []' 20 या तो वर्ण होने की घोषणा करता हूं। मेमोरी सस्ता है, और हम केवल कुछ अतिरिक्त बाइट्स ही बात कर रहे हैं। और जब आप बाद में प्रारूप स्ट्रिंग को बदलने का निर्णय लेते हैं तो यह आपको बचाता है लेकिन बफर की लंबाई को अपडेट करना भूल जाता है। संकलक को सरणी के आकार को पास करने के लिए 'sizeof()' के उपयोग के लिए –

+0

+1। –

4

strftime फ़ंक्शन पर एक नज़र डालें, जो आपको अपनी पसंद के प्रारूप के साथ एक चार सरणी में समय लिखने की अनुमति देता है।

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

समय से निपटने के लिए महत्वपूर्ण प्रकार (समय की दीवार-घड़ी प्रकार, नहीं प्रक्रिया/धागा समय) time_t और struct tm हैं।
कुछ कामों के साथ आप एक और दूसरे के बीच परिवर्तित कर सकते हैं, लेकिन आपको स्थानीय समय बनाम यूटीसी समय पर ध्यान देना होगा।

ख़याल description of <time.h>, वहाँ कार्यों की कोशिश जब तक आप फिर से सी

में समय grok, UTC समय और स्थानीय समय पर ध्यान देना

+0

क्या हम ऐसा नहीं करना चाहिए जो हम स्वाभाविक रूप से असुरक्षित 'sprintf() 'के उपयोग को बढ़ाने के लिए नहीं कर सकते? –

+0

मैं थोड़ी सहमत हूं ... लेकिन ... ऊपर स्निपेट में नहीं ... क्या हम ऐसा नहीं करना चाहिए जो हम स्वाभाविक रूप से असुरक्षित पूर्णांक के अतिरिक्त उपयोग को बढ़ाने के लिए नहीं कर सकते? – pmg

संबंधित मुद्दे

 संबंधित मुद्दे