2012-12-13 7 views
6

にunsigned int型配列Iはintの配列とのような配列の長さへのポインタを有する:は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 "の数と同じであることを確認してください。

配列の長さは何でもかまいませんので、arrayの要素を明示的に列挙せずにsprintf (buffer, pattern, &array[0], &array[1], &array[2])を実行できる方法はありますか? 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、etc)"である必要はありません。これは、一度に1つの%dを置換するために部分文字列を使用するという考えを私に与えてくれました。ありがとう! – Chirag