2011-01-10 21 views
6

किसी कारण से, मैं नहीं कर यह काम कर पाने:va_start में स्ट्रिंग का उपयोग कैसे करें?

void examplefunctionname(string str, ...){ 
... 
    va_start(ap, str.c_str()); 

है और न ही मैं इस काम मिलता है:

void examplefunctionname(string str, ...){ 
... 
    int len = str.length(); 
    char *strlol = new char[len+1]; 
    for(int i = 0; i < len; i++){ 
     strlol[i] = str[i]; 
    } 
    strlol[len] = 0; 
    va_start(ap, strlol); 

लेकिन यह करता है:

void examplefunctionname(const char *str, ...){ 
... 
    va_start(ap, str); 

किसी ने मुझे दिखा सकता है मैं कैसे const char * के बजाय स्ट्रिंग का उपयोग कर सकते हैं?

इसके यादृच्छिक संख्या outputting जब मैं फोन examplefunctionname("%d %d %d", 1337, 1337, 1337)

+1

आप अपने उदाहरणों में 'va_start (ap, str)' का उपयोग क्यों नहीं कर रहे हैं जहां फ़ंक्शन 'स्ट्रिंग' लेता है? आपको 'va_start' मैक्रो में पैरामीटर के नाम का उपयोग करना होगा, मनमाना अभिव्यक्ति नहीं। –

+0

ओह डर्न, मैंने सोचा कि यह वहां एक स्ट्रिंग पढ़ता है, इसलिए यह चर के लिए एक पता लेता है ... और अंतिम चर जानने के लिए इसका उपयोग करता है और फिर लूप को अगली बार? आह .. मैं इसे अब देखता हूँ – Newbie

उत्तर

5
प्रलेखन से

:

va_start(va_list ap, last) ... पैरामीटर last चर तर्क सूची, बुला समारोह प्रकार जानता है जैसे कि, जिनमें से आखिरी पैरामीटर से पहले अंतिम पैरामीटर का नाम है।

आप अपने काम करने के उदाहरण में सही ढंग से ऐसा करने के बाद: va_start(ap, str), और str अंतिम ज्ञात तर्क है। लेकिन अन्य दो उदाहरणों में, आप va_start पर विषम चीजें पारित कर रहे हैं।

0

va_start किसी मैक्रो एक स्थान के रूप में दूसरा तर्क का उपयोग करता है है, तो आप इसलिए पिछले उदाहरण आप दे उपयोग करने के लिए की जरूरत है।

1

va_start पिछले पैरामीटर की आवश्यकता है। इसका मतलब है कि आपको इसके प्रकार के बावजूद सीधे स्ट्र में गुजरना होगा। यह एक कॉन्स char * नहीं लेता है और यह आपके लिए स्ट्रिंग को पार्स नहीं करता है।

0
void examplefunctionname(string str, ...){ 
... 
va_start(ap, str); 
संबंधित मुद्दे