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

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

导致程序崩溃的调用:

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

最佳答案

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

每次你调用va_arg,你必须告诉下一个参数的类型是什么。这不仅是为了打字,也是因为需要参数的大小来更新“幕后”指针。

如果您以这种方式修改循环:

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

然后当您调用您的函数时,您将能够使用格式参数来说明哪些参数是字符串,哪些是整数。例如:

formatter(str, "12221", str1, i1, i2, i3, str2);

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

关于c - 如何在C中传递N个不同类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41913921/

相关文章:

asp.net-mvc - ASP.NET MVC路由冲突-输入变量为空值

c++ - C 和 C++ 中 char 的区别?

c - 使用指针将字符串数组传递给函数

c - ftruncate 无法与 msys2 一起正常工作

PHP 你能更新字符串中的变量吗?

php - PHP参数的用途

c++ - 如何使用makefile从C中的另一个目录包含.a静态库和.h文件?

variables - 引用-替换和变量

python - 在Python类的另一个函数中获取函数变量

javascript - 获取.js文件的参数