在C语言中,sprintf和unsigned int数组是什么?

9

我有一个指向整数数组的指针,以及数组的长度,如下:

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"和其他字符,但可以是任何形式(例如"Test %d: %d"或"%d %d"),并且array的长度始终与"%d"的数量相同。
由于数组的长度可以是任意值,有没有办法做到在不枚举array元素的情况下执行sprintf(buffer,pattern,&array[0],&array[1],&array[2])?比如说像sprintf(buffer,pattern,array)这样的方式。我可以编写任意数量的辅助函数。我考虑模拟一个va_list,但这似乎是不好的做法,因为它会限制程序在特定的编译器上运行。
3个回答

8

在单个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上的演示链接

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

s[0]=0;是必要的吗? - imreal

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

我在问题中可能应该更具体一些。字符串的格式不一定是“(%d,%d等)”。尽管这给了我使用子字符串逐个替换一个%d的想法。谢谢! - Chirag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接