2010-12-30 9 views
5

मैं सी भाषा में एक फ़ंक्शन को परिभाषित करना चाहता हूं जो किसी भी डेटाटाइप के असीमित संख्या में तर्क ले सकता है। उदाहरण के लिए: printf(), scanf(), आदिसी में फंक्शन?

इस पर कोई विचार?

+7

* नोट: शायद सबसे अच्छा बचा जहां संभव हो ... –

+0

आप एक समारोह जो तर्क का एक "असीमित" संख्या ले जा सकते हैं नहीं लिख सकते हैं। हमेशा कुछ ऊपरी सीमा होती है। आप शायद क्या मतलब है, तर्कों की "परिवर्तनीय" संख्या है। – Nawaz

उत्तर

8

सी में तर्कों की चर संख्या का उपयोग करने के लिए आप शीर्ष लेख

#include <stdarg.h> 

सी में printf() समारोह है कि बहस के चर संख्या लेता है का एक उदाहरण है शामिल करने के लिए की जरूरत है।

int printf(const char *fmt, ...) 

अधिक जानकारी here

+0

हम यादृच्छिक क्रम में तर्कों का उपयोग कैसे कर सकते हैं? लिंक हमें क्रमशः उन तक पहुंचने का तरीका दिखाता है। –

2
void printf(char* format, ...) 
{ 
} 

Variadic Functions और varargs.h या stdarg.h (संकलक के आधार पर) देखें।

+5

अभी भी उपयोग में कोई कंपाइलर नहीं होना चाहिए जिसे अभी भी '' की आवश्यकता है; सभी आधुनिक कंपाइलर्स (लगभग 10 साल से कम का अर्थ) ' 'का समर्थन करते हैं और नए कोड का उपयोग केवल उसमें किया जाना चाहिए। ध्यान दें कि कुछ कंपाइलर अब '' का समर्थन नहीं करते हैं; मुझे लगता है कि मुझे एचपी-यूएक्स (दुर्घटना से) पर इसका सामना करना पड़ा। –

1

<stdarg.h> शीर्षलेख और संबंधित दस्तावेज़ देखें।

5

एक ... अंतिम तर्क लेने के रूप में समारोह घोषित। va_list के रूप में तर्कों तक पहुंचने के लिए आपको <stdarg.h> से मैक्रोज़ का उपयोग करने की आवश्यकता होगी।

तुम सिर्फ कुछ चाहते हैं "printf की तरह है, लेकिन थोड़ा अतिरिक्त व्यवहार के साथ", तो आप va_list करने के लिए vprintf, vfprintf, या vsprintf पारित कर सकते हैं।

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

#ifdef __GNUC__ 
    __attribute__((format(printf, 1, 2))) 
#endif 
void PrintErrorMsg(const char* fmt, ...) 
{ 
    time_t  now; 
    char  buffer[20]; 
    va_list args; 

    va_start(args, fmt); 
    time(&now); 
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", gmtime(&now)); 
    fprintf(stderr, "[%s] ", buffer); 
    vfprintf(stderr, fmt, args); 
    fputc('\n', stderr); 
    va_end(args); 
} 
संबंधित मुद्दे