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)
当使用可变参数(在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)
在您的示例中,当您的格式字符串告诉格式化程序应该期望一个字符串时,您传递一个整数.因此崩溃了.