C中的sprintf和unsigned int数组

Chi*_*rag 7 c printf variadic-functions

我有一个指向int数组的指针和数组的长度:

unsigned int length = 3;
int *array;        // Assume the array has 3 initialized elements
Run Code Online (Sandbox Code Playgroud)

我也有一个字符串和一个缓冲区(假设它足够大)放入sprintf中:

char buffer[128];
const char *pattern = "(%d, %d, %d)\n";
Run Code Online (Sandbox Code Playgroud)

假设pattern只有"%d"和其他字符,但可以是任何形式(即"Test%d:%d"或"%d%d"),并且长度array将始终相同作为"%d"的数量.

由于数组的长度可以是任何东西,有没有办法在sprintf (buffer, pattern, &array[0], &array[1], &array[2])没有明确枚举元素的情况下做到array?有点像sprintf (buffer, pattern, array).我可以根据需要编写尽可能多的辅助函数.我正在考虑伪造一个va_list,但这似乎是不好的做法,因为它将程序限制为某个编译器.

das*_*ght 6

将所有元素传递到一个单元中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);
Run Code Online (Sandbox Code Playgroud)

这是一个关于ideone的演示链接.


Kei*_*las 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;
    }
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

char buffer[128];
char formattedints[128];
sprintf("(%s)\n", format_uint_array(formattedints, array, 3, ", ", "%d%s"));
Run Code Online (Sandbox Code Playgroud)