Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C में वेरिएबल लेंथ आर्गुमेंट्स (Variadic Functions)


C में <stdarg.h> मैक्रोज़ का उपयोग करके वेरिएडिक फंक्शन्स (चर संख्या में पैरामीटर्स वाले फंक्शन्स) बनाए जा सकते हैं।

मुख्य मैक्रोज़

मैक्रोउद्देश्य
va_listआर्गुमेंट लिस्ट होल्ड करने के लिए टाइप
va_start(va_list, last_fixed_arg)आर्गुमेंट लिस्ट प्रारंभ करता है
va_arg(va_list, type)अगला आर्गुमेंट प्राप्त करता है और एडवांस करता है
va_end(va_list)क्लीनअप करता है
va_copy(dest, src)va_list कॉपी करता है (C99)

उदाहरण: औसत निकालना

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

double average(int count, ...) {
    va_list args;
    va_start(args, count);
    
    double sum = 0.0;
    for (int i = 0; i < count; i++) {
        sum += va_arg(args, int);  // प्रत्येक आर्गुमेंट int माना
    }
    
    va_end(args);
    return sum / count;
}

int main() {
    printf("Avg of 2,3,4,5: %.2f\n", average(4, 2, 3, 4, 5));
    printf("Avg of 5,10,15: %.2f\n", average(3, 5, 10, 15));
    return 0;
}

आउटपुट

Avg of 2,3,4,5: 3.50
Avg of 5,10,15: 10.00

महत्वपूर्ण नियम

  • कम से कम एक फिक्स्ड पैरामीटर होना चाहिए (count यहाँ)।
  • va_arg में सही टाइप पास करें - गलत टाइप अनडिफाइंड बिहेवियर देता है।
  • va_end हमेशा कॉल करें (कुछ प्लेटफॉर्म्स पर आवश्यक)।
  • कॉलर को आर्गुमेंट काउंट बताना होगा (या सेंटिनल वैल्यू उपयोग करें)।

वेरिएडिक फंक्शन के अन्य पैटर्न्स

// पैटर्न 2: सेंटिनल वैल्यू (जैसे NULL टर्मिनेटेड)
void print_strings(const char *first, ...) {
    va_list args;
    va_start(args, first);
    for (const char *s = first; s != NULL; s = va_arg(args, const char*))
        printf("%s ", s);
    va_end(args);
}

// पैटर्न 3: फॉर्मेट स्ट्रिंग (printf स्टाइल)
void log_msg(const char *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);  // vprintf, vfprintf, vsnprintf उपयोगी हैं
    va_end(args);
}
  1. - C भाषा में पूरी स्ट्रक्चर को फंक्शन में आर्गुमेंट के रूप में पास करना

    पास बाय वैल्यू (Pass by Value) जब पूरी स्ट्रक्चर को फंक्शन में पास किया जाता है, तो उसकी एक प्रति (copy) बनती है। मूल स्ट्रक्चर अपरिवर्तित रहती है। सिंटैक्स // फंक्शन घोषणा void display(struct Student s); // मान द्वारा // कॉल struct Student s1 = {1, Amit, 85.5}; display(s1); // कॉपी पास होती ह

  1. - C और C++ में वेरिएबल-लेंथ सरणी (Variable Length Arrays)

    वेरिएबल-लेंथ सरणी (VLA) एक ऐसी सरणी है जिसका आकार कंपाइल टाइम के बजाय रनटाइम पर निर्धारित होता है। C में VLA समर्थन C99 मानक: VLA का समर्थन करता है C11 मानक: VLA वैकल्पिक बना दिया गया (__STDC_NO_VLA__ मैक्रो जांचें) स्टैक पर आवंटित (आमतौर पर) स्कोप समाप्त होने पर स्वचालित रूप से मुक्त C में VLA

  1. C प्रोग्राम में विषम लंबाई की स्ट्रिंग को  X  फॉर्मेट में प्रिंट करें C प्रोग्राम में विषम लंबाई की स्ट्रिंग को 'X' फॉर्मेट में प्रिंट करें

    समस्या विवरण एक स्ट्रिंग दी गई है, प्रोग्राम को स्ट्रिंग को X फॉर्मेट में प्रिंट करना होगा। संदर्भ के लिए नीचे दी गई छवि देखें। एल्गोरिदम शुरुआत चरण 1: void print(string str, int len) फंक्शन घोषित करें i = 0 से len-1 तक लूप j = len-1-i सेट करें k = 0 से len-1 तक लूप