2012-12-13 8 views
6

że posiada wskaźnik do tablicy wskazówki i długości tablicy w następujący sposób:sprintf unsigned int tablicy w C

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

również mieć łańcuch i bufor (zakładając, że jest wystarczająco duży) wprowadzić do sprintf jako takie:

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

Załóżmy, że pattern będą miały tylko "% d" S i inne znaki, ale może być każda forma (czyli "test% d:% d" lub „% d % d "), a długość array zawsze będzie taka sama jak liczba"% d ".

Ponieważ długość tablicy może być cokolwiek, czy jest jakiś sposób, że mogę zrobić sprintf (buffer, pattern, &array[0], &array[1], &array[2]) bez jawnego wyliczenia elementów array? Coś podobnego do linii sprintf (buffer, pattern, array). Potrafię napisać tyle funkcji pomocnika, ile potrzeba. Myślałem o sfałszowaniu va_list, ale wydaje się to być złą praktyką, ponieważ ogranicza program do określonego kompilatora.

Odpowiedz

2

można zrobić coś takiego ...

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

następnie używać go jak

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

Jest to niezbędne 's [0] = 0;'? – imreal

5

Przechodząc wszystkie elementy w jednym va_list nie pomoże, ponieważ ciąg formatu musi być utworzone w pętli. Ponieważ nie można uciec pętlę tak, równie dobrze można wykonać drukowania w tej samej pętli:

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

Oto link to a demo on ideone.

2

Brak pętle:

#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

Prawdopodobnie powinienem być bardziej konkretny w moim pytaniu. Format ciągu znaków niekoniecznie musi być "(% d,% d, itp.)". Mimo to dało mi to pomysł użycia podłańcuchów do zastąpienia jednego% d na raz. Dzięki! – Chirag

Powiązane problemy