如何在C中传递不同类型的N个参数

Uls*_*ing 1 c variables parameters

我试图创建一个函数,它可以在前两个参数之后接受任何数量的char,char*和int类型的参数.但我无法接受除char*之外的其他值.这是我有的:

int formatter (char *str, const char *format, ...) {
    va_list valist;
    va_start(valist, format);
    int i;
    for (i = 0; i < strlen(format); i++) {
        switch (format[i]) {
            case '1':
                strcat(str, va_arg(valist, char*));
        }
    }

    va_end(valist);
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

导致程序崩溃的调用:

int leet = 1337;
char temp[10] = "Hello!";
char result[100] = "";
formatter(result, "1 My name is 1", temp, leet);
Run Code Online (Sandbox Code Playgroud)

Rém*_*net 5

当使用可变参数(在C中)时,函数内部没有直接的方法来知道你给出的参数.通常的解决方法是使用其中一个参数(在您的情况下,与许多其他format参数一样,参数)来确定额外参数的类型.

每次调用va_arg时,都必须告诉下一个参数的类型.这不仅用于键入,还因为需要参数的大小来更新"幕后"指针.

如果你修改你的循环:

switch (format[i]) {
    case '1':
        doSomethingWithAString(va_arg(valist, char*));
        break;
    case '2':
        doSomethingWithAInt(va_arg(valist, int));
        break;
}
Run Code Online (Sandbox Code Playgroud)

然后,当您调用函数时,您将能够使用format参数来说明哪些参数是字符串,哪些参数是int.例如:

formatter(str, "12221", str1, i1, i2, i3, str2);
Run Code Online (Sandbox Code Playgroud)

在您的示例中,当您的格式字符串告诉格式化程序应该期望一个字符串时,您传递一个整数.因此崩溃了.