如何通过可变数量的参数传递函数中的参数列表?

时间:2016-06-02 21:05:52

标签: c printing printf

我有一个字符串掩码,看起来像这样:

                  +--\
                  |   \
                  |    \
              +---|     \
              +---|      \
+                 |       \
|\  +---------------------------------+\
| \ | %d|    %d|    %d|    %d|    %d| | \
|  \| %d|    %d|    %d|    %d|    %d| | |\
|   | %d|    %d|    %d|    %d|    %d| | | \
|---|                                 | |  \
|---|                                 | |  /
|   | %d|    %d|    %d|    %d|    %d| | | /
|  /| %d|    %d|    %d|    %d|    %d| | |/
| / | %d|    %d|    %d|    %d|    %d| | /
|/  +---------------------------------+/
+                 |       /
              +---|      /
              +---|     /
                  |    /
                  |   /
                  +--/

我需要printf它 - printf(string-mask, param1,param2,param3, etc...),但参数数量很大(在实际字符串中大约是40)。有没有办法避免手动枚举参数?

P.S。我正在使用纯C。

P.S.S。 params存储在数组中。

1 个答案:

答案 0 :(得分:5)

迭代数组(字符串),直到找到打印说明符。然后从您之前离开的位置打印字符串,包括说明符,同时从值数组中传递单个参数。

这是一个快速而肮脏的解决方案,没有错误检查,假设每个说明符都是%d,并且确实有param_count个。字符串也必须是可修改的。

const size_t param_count = 30;
char* first = string;
char* last = string;
for( size_t i = 0 ; i < param_count ; i++ )
{
    last = strchr( last , '%' ); //find the specifier 
    last += 2 ;  //skip the specifier
    const char temp = *last;
    *last = '\0';  //terminate the 'sub-string'
    printf( first , param[i] );
    *last = temp;   //restore the 'string'
    first = last;
}
printf( first ); //print the remaining string

以下是输出:https://ideone.com/zIBsNj