我有一个指向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";
假设模式中只有“%d”和其他字符,但可以是任何形式(即“Test%d:%d”或“%d%d”),并且数组的长度将始终为与“%d”的数量相同.
由于数组的长度可以是任何东西,有没有办法我可以做sprintf(缓冲区,模式,&数组[0],和数组[1],和数组[2])而不显式枚举元素数组?沿着sprintf(缓冲区,数组)行的东西.我可以根据需要编写尽可能多的辅助函数.我正在考虑伪造一个va_list,但这似乎是不好的做法,因为它将程序限制为某个编译器.
解决方法
在单个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);