2010-11-13 9 views
5

इस कोड को मुझे चेतावनी देता है:scanf() का उपयोग कर time_t चर में डेटा को कैसे पढ़ा जाए?

$ cat test.c 
#include<stdio.h> 
#include<time.h> 

int main() { 

    time_t t; 
    scanf("%lld", &t); 
    printf("%lld\n", t); 
    return 0; 
} 
$ gcc test.c -o test 
test.c: In function ‘main’: 
test.c:7: warning: format ‘%lld’ expects type ‘long long int *’, but argument 2 has type ‘time_t *’ 
test.c:8: warning: format ‘%lld’ expects type ‘long long int’, but argument 2 has type ‘time_t’ 
$ 
चेतावनी से

अलावा, के रूप में उम्मीद कोड काम करता है।

संकलन पर चेतावनियां प्राप्त करने के लिए मुझे क्या करना चाहिए (कृपया कोई संकलक प्रगति चाल नहीं है)?

उत्तर

8

सही प्रकार time_t का आपके प्लेटफ़ॉर्म और ओएस पर निर्भर करता है। यह अभी भी 32 बिट (या तो int या long) है, 64 नहीं, और कुछ भी फ्लोट का उपयोग करते हैं। करने के लिए सही बात ज्ञात आकार पूर्णांक (या तो int या long long) में पढ़ना है और उसके बाद मान को time_t को दूसरे चरण के रूप में असाइन करना है।

+0

मैं सुरक्षित होने के लिए सबसे बड़ा संभव आकार का उपयोग करूंगा। और 'strtoull'' scanf' से बेहतर विकल्प होगा। –

+0

@ आर ..: 'strtoll()' के बाद से 'time_t' आम तौर पर हस्ताक्षरित है। –

+0

+1। दरअसल, POSIX एक पूर्णांक या वास्तविक फ़्लोटिंग प्रकार होने के लिए 'time_t' को अनुमति देता है। वास्तव में – dreamlax

3

आपको अपने सिस्टम की समय_टी परिभाषा से मेल खाने के लिए प्रारूप की आवश्यकता है।

gcc test.c -o test --save-temps 

तो

grep time_t test.i|grep typedef 

सबसे अधिक संभावना के साथ संकलित करें, इससे आपको पता चल जाएगा कि टाइम_टी "लंबे पूर्णांक" है, तो आप "% ld" के साथ इसे स्कैन की जरूरत है।

+0

और यदि आपको विभिन्न आर्किटेक्चर पर अलग-अलग उत्तर मिलते हैं तो आप उन्हें 'पोर्टेबल' बनाने के लिए अपने कोड को 'ifdef' कर सकते हैं – rano

2

सबसे पहले, आपका कंपाइलर सही है: कुछ भी गारंटी नहीं देता है कि time_t वास्तव में 64-बिट हस्ताक्षरित पूर्णांक है। प्लेटफ़ॉर्म के आधार पर यह 32-बिट पूर्णांक या यहां तक ​​कि एक फ़्लोटिंग-पॉइंट मान भी हो सकता है।

अब, अगर आप बिल्कुल, सकारात्मक सुनिश्चित करें कि time_t अपने मंच पर एक long long है, और आप, आप कर सकते हैं स्वरूपण चेतावनी से बचना चाहते हैं:

time_t t; 
scanf("%lld", (long long *) &t); 
printf("%lld\n", (long long) t); 
1

scanf() साथ पूर्णांक के एक ज्ञात आकार का उपयोग करें और फिर time_t के परिणाम कन्वर्ट:

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    long long llv; 
    time_t t; 
    scanf("%lld", &llv); 
    t = llv; 
    printf("%lld\n", (long long)t); 
    return 0; 
} 

इस उदाहरण में, यह आप बहुत खरीदने के लिए प्रतीत नहीं होता है, लेकिन आप चर t पारित करने के लिए चाहते थे कुछ समय-कुशलता कार्यों के लिए, तो आपके पास काम करने के लिए सही प्रकार होगा।

यदि आप scanf() के लिए लिंक किए गए यूआरएल (POSIX विस्तारित संस्करण) को देखते हैं, तो आप देखेंगे कि time_t का कोई उल्लेख नहीं है। इस प्रकार, scanf() के साथ time_t मान पढ़ने के लिए कोई भी तंत्र सीधे-आगे से कुछ हद तक कम होना चाहिए। डिट्टो, time_t मान प्रिंट करने वाली कुछ भी सीधी-आगे की तुलना में कुछ हद तक कम है।

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