2012-12-13 39 views
6

में अहस्ताक्षरित int सरणी मैं ints की एक सरणी के लिए एक सूचक है और इस तरह के रूप में सरणी की लंबाई है:sprintf और सी

unsigned int length = 3; 
int *array;  // Assume the array has 3 initialized elements 

मैं भी एक स्ट्रिंग और एक बफर है (मान यह पर्याप्त रूप से बड़े है) जैसे sprintf में लाना:

char buffer[128]; 
const char *pattern = "(%d, %d, %d)\n"; 

मान लें कि pattern केवल उस में "% d" एस और अन्य पात्रों होगा, लेकिन किसी भी रूप हो सकता है (यानी "टेस्ट% d:% d" या "% d % d "), और array की लंबाई हमेशा"% d "की संख्या के समान होगी।

चूंकि सरणी की लंबाई कुछ भी हो सकती है, क्या कोई तरीका है कि मैं sprintf (buffer, pattern, &array[0], &array[1], &array[2]) कर सकता हूं बिना array के तत्वों को स्पष्ट रूप से समझाए? sprintf (buffer, pattern, array) की रेखाओं के साथ कुछ। मैं आवश्यकतानुसार कई सहायक कार्यों को लिख सकता हूं। मैं एक va_list faking के बारे में सोच रहा था, लेकिन यह बुरा अभ्यास प्रतीत होता है क्योंकि यह कार्यक्रम को एक निश्चित संकलक को प्रतिबंधित करता है।

उत्तर

2

आप कुछ की तरह कर सकते हैं ...

char* format_uint_array(char *b, unsigned int* data, int length, char* delim, char* fmt) 
    { 
     int i; 
     char s[50]; 
     b[0] = 0; 
     for(i = 0; i < length; i++) 
     { 
      s[0]=0; 
      sprintf(s, fmt, data[i], (i<length-1)?delim : ""); 
      strcat(b, s);  
     } 
     return b; 
    } 

तो, जैसे

char buffer[128]; 
char formattedints[128]; 
sprintf("(%s)\n", format_uint_array(formattedints, array, 3, ", ", "%d%s")); 
+0

है यह आवश्यक 'रों [0] = 0;'? – imreal

5

एक भी va_list में सभी तत्वों को पासिंग मदद करने के लिए नहीं जा रहा है इसका इस्तेमाल क्योंकि प्रारूप स्ट्रिंग होने की जरूरत है वैसे भी एक लूप में बनाया गया। जब से तुम पाश वैसे भी बच नहीं सकते, तो आप के रूप में अच्छी ही पाश में मुद्रण कर सकते हैं:

int data[] = {12, 345, 6789, 101112}; 
char buf[128], *pos = buf; 
for (int i = 0 ; i != 4 ; i++) { 
    if (i) { 
     pos += sprintf(pos, ", "); 
    } 
    pos += sprintf(pos, "%d", data[i]); 
} 
printf("%s\n", buf); 

यहाँ एक link to a demo on ideone है।

2

कोई छोरों:

#include <stdio.h> 

int array[3] = {1, 2, 3};  
char buffer[128]; 

char *array_to_str(char * str, int *array, unsigned int n) { 
    int r; 
    if (n == 0) return 0; 
    if (n == 1) r = sprintf(str, "%d", array[0]); 
    else  r = sprintf(str, "%d, ", array[0]); 
    array_to_str(str + r, array + 1, n - 1); 
    return str; 
} 

int main() { 
    printf("(%s)\n", array_to_str(buffer, array, 3)); 
    return 0; 
} 
+0

शायद मुझे अपने प्रश्न में अधिक विशिष्ट होना चाहिए था। स्ट्रिंग का प्रारूप जरूरी नहीं है "(% d,% d, आदि)"। हालांकि इसने मुझे एक समय में एक% डी को प्रतिस्थापित करने के लिए सबस्ट्रिंग का उपयोग करने का विचार दिया था। धन्यवाद! – Chirag