2012-12-13 18 views
6

işaretsiz int dizi I ints bir dizi için bir işaretçi ve bu şekilde dizinin uzunluğuna sahiptir: Ayrıca, bir dizi ve bir tampona sahipsprintf ve C

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

(varsayalım yeterince büyüktür) gibi sprintf koymak için:

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

pattern sadece o "% D" s ve diğer karakter varsayın, ancak herhangi bir şekilde olabilir (yani, "test% d:% d" veya "% D % d ") ve array uzunluğunun her zaman"% d "sayısı ile aynı olacağını.

Dizinin uzunluğu bir şey olabileceğinden, array öğelerini açıkça numaralandırmadan sprintf (buffer, pattern, &array[0], &array[1], &array[2]) yapabilmem mümkün mü? sprintf (buffer, pattern, array) hatları boyunca bir şey. Gerekli olduğu kadar çok yardımcı fonksiyon yazabilirim. Bir va_list'i taklit etmeyi düşünüyordum, fakat bu programın belirli bir derleyiciye sınırlandırılmasından dolayı kötü bir uygulama gibi görünüyor. biçim dizesi gerektiğinden gibi bir şey yapabilirsiniz

cevap

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; 
    } 

sonra,

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

, gerektiğinde 'nin [0] = 0; '? – imreal

5

yardım etmeyecek tek va_list tüm unsurları Geçme gibi kullanırız zaten bir döngüde oluşturuldu. Neyse döngü kaçamaz beri siz de aynı döngüde baskı yapabilir:

İşte
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); 

bir link to a demo on ideone olduğunu.

2

Resim döngüler:

#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

Muhtemelen soruma göre daha spesifik olmalıydım. Dizenin biçimi mutlaka "(% d,% d, etc)" olmayabilir. Bu bana bir kerede bir% d değiştirmek için alt dizeleri kullanma fikri verdi. Teşekkürler! – Chirag