2012-12-13 75 views
6

無符號整型陣列I具有一個指向整數數組和所述陣列的長度,這樣:sprintf和用C

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」 S和其他字符,但可以是任何形式(即「測試%d:%d」或「%d %d「),並且array的長度將始終與」%d「的數量相同。

由於數組的長度可以是任何東西,有沒有什麼辦法可以做sprintf (buffer, pattern, &array[0], &array[1], &array[2])而不明確地列舉出array的元素?東西沿着sprintf (buffer, pattern, array)。我可以根據需要編寫儘可能多的幫助函數。我正在考慮僞造一個va_list,但這似乎是不好的做法,因爲它將程序限制在某個編譯器中。

回答

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

這是必要'S [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等)」。雖然這確實給了我一次使用子字符串替換%d的想法。謝謝! – Chirag