【问题标题】:sprintf and unsigned int array in CC中的sprintf和无符号整数数组
【发布时间】:2012-12-13 01:44:52
【问题描述】:

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

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,但这似乎是一种不好的做法,因为它将程序限制为某个编译器。

【问题讨论】:

    标签: c printf variadic-functions


    【解决方案1】:

    在单个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】:

      你可以做类似的事情......

      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;吗?
      【解决方案3】:

      没有循环:

      #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, etc)”。尽管这确实给了我使用子字符串一次替换一个 %d 的想法。谢谢!
      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 2018-08-18
      • 2021-02-28
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多