c - 使用 va_args 而不传递 num(如 printf)

标签 c variadic-functions

以下是我可以想出的将可变长度参数传递给函数的最基本示例:

int printme(int num, ...)
{
    va_list ap;
    va_start(ap, num);
    for (int i = 0; i < num; ++i) {
        char *arg = va_arg(ap, char *);
        printf("%d. %s\n", i + 1, arg);
    }
    va_end(ap);
    return 1;
}

int main(void)
{
    printme(2, "X", "YY");
}
但是,请注意我将长度作为第一个参数(或任何参数)传递。是否可以使用这些va_带有类似 printf 的宏-ish 功能?例如,我可以做这样的事情(不传递参数的数量?
print2("Hello something %s %s", "Arg 1", "Arg 2");
print2("Hello something %s %s %s", "Arg 1", "Arg 2", "Arg 3");
如果是这样,接收那个的函数会是什么样的?如果不可能,如何 printf实现呢?

最佳答案

如果你只想传递字符串,可以很容易地通过编写一个函数来解析第一个参数,如 countargs(char*)我在这里写的。它返回参数的数量:

#include <stdarg.h>
#include <stdio.h>
int printme(char* fmt, ...)
{
    va_list ap;
    int num = countargs(fmt);
    va_start(ap, num);
    for (int i=0; i < num; ++i) {
        char* arg = va_arg(ap, char*);
        printf("%d. %s\n", i+1, arg);
    }
    va_end(ap);
    return 1;
}

int countargs(char* fmt)
{
    int i, num = 0;
    if(strlen(fmt) < 2) 
    { 
        return 0;
    }
    for(i = 0; fmt[i+1] != '\0'; i++)
    {
        if (fmt[i] == '%' && fmt[i+1] == 's')
        {
            num++;
        }
    }
    return num;
}

int main(void)
{
    printme("%s%s", "Stack", "Overflow");
}

关于c - 使用 va_args 而不传递 num(如 printf),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66502968/

相关文章:

java - 具有可变类型参数的泛型

c - 缺少可变长度参数中除第一个参数之外的所有参数

通过 CreateProcess 启动时的 cl.exe 似乎没有写权限

c - Linux 获取开机后的系统时间

c - va_arg 不适用于 double

python - 当用C扩展Python时,如何用C动态构建复杂的结构?

c - 如何使用 fgets 在 for 循环中计算磁盘读取速度(以 MB/s 为单位)

c - 很棒的 C 教程?

使用 libcurl 捕获 RTSP 流

function - Elixir 函数有最大的 Airty 吗?