2009-09-28 8 views
38

मैं समझता हूँ printf, fprintf, sprintf आदि कार्य करता है और vprintf, vfprintf, vsprintf आदि कार्यों के बीच अंतर वे समारोह तर्क के साथ कैसे पेश से कोई लेना देना नहीं है। लेकिन कैसे विशेष रूप से? क्या वास्तव में किसी दूसरे का उपयोग करने का कोई कारण है? क्या मुझे हमेशा printf का उपयोग करना चाहिए क्योंकि सी में देखने के लिए यह एक आम बात है, या इसके बजाय vprintf चुनने का एक वैध कारण है?printf और vprintf फ़ंक्शन परिवारों के बीच क्या अंतर है, और मुझे दूसरे पर एक का उपयोग कब करना चाहिए?

उत्तर

59

printf() और मित्र सामान्य उपयोग के लिए हैं। vprintf() और दोस्तों के लिए जब आप अपना खुद का printf() लिखना चाहते हैं। आप त्रुटियों मुद्रित करने के लिए एक समारोह लिखना चाहते हैं कहते हैं:

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    // what here? 
    va_end(args); 
    return result; 
} 

आप देखेंगे कि आप printf() को args पारित नहीं हो सकता, क्योंकि printf() बल्कि एक va_list तर्क से कई तर्क लेता है,।

int error(char *fmt, ...) 
{ 
    int result; 
    va_list args; 
    va_start(args, fmt); 
    fputs("Error: ", stderr); 
    result = vfprintf(stderr, fmt, args); 
    va_end(args); 
    return result; 
} 
+1

बेशक, तो आप एक 'चेतावनी दी है()' समारोह है कि तरह काम करता है चाहता हूँ: vprintf() काम करता है, तथापि, तर्कों की एक चर संख्या के बजाय एक va_list तर्क लेते हैं, तो यहाँ पूरा संस्करण है 'त्रुटि() 'लेकिन प्रिंटिंग" चेतावनी: "इसके बजाय, आप अपना _own_' vprintf() 'शैली फ़ंक्शन बनाते हैं:' int verror (char * prefix, char * fmt, va_list args);' और 'त्रुटि() ' कॉल करें कि "त्रुटि:" और 'चेतावनी()' इसे "चेतावनी" के साथ कॉल करें, लेकिन यह सभी अर्थशास्त्र है। –

+0

विविधता कार्यों के बारे में जानने के लिए समय! इस जवाब ने चीजों को मंजूरी दे दी, धन्यवाद। –

13

आप कभी भी vprintf() का उपयोग नहीं करना चाहते हैं, लेकिन जब आपको उदास होना आवश्यक है तो यह अविश्वसनीय रूप से आसान है लपेटें printf()। इन मामलों के लिए, आप परिवर्तनीय तर्क (...) के साथ शीर्ष-स्तरीय फ़ंक्शन को परिभाषित करेंगे। फिर आप उन्हें va_list में एकत्र करेंगे, अपनी प्रसंस्करण करें, और प्रिंटआउट होने के लिए va_list पर अंततः vprintf() पर कॉल करें।

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

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