7

私はintの配列へのポインタと配列の長さを次のように持っています:

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 とその他の文字のみが含まれますが、任意の形式 (つまり、"Test %d: %d" または "%d %d") であり、 の長さarrayは常に同じであると仮定します。 "%d" の数として。

sprintf (buffer, pattern, &array[0], &array[1], &array[2])配列の長さは何でもよいので、要素を明示的に列挙せずにできる方法はありarrayますか? の線に沿った何かsprintf (buffer, pattern, array)。必要なだけヘルパー関数を書くことができます。私はva_listを偽造することを考えていましたが、プログラムを特定のコンパイラに制限するため、これは悪い習慣のようです.

4

3 に答える 3

7

いずれにせよ、フォーマット文字列はループで作成する必要があるため、すべての要素を単一で渡す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);

これはideone のデモへのリンクです

于 2012-12-13T01:58:26.257 に答える
3

あなたは次のようなことができます...

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"));
于 2012-12-13T01:52:23.263 に答える
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;  
} 
于 2012-12-13T01:59:05.183 に答える