我正在尝试创建一个函数,它可以在前两个参数之后接受任意数量的 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/