char argvv[8][32];
int func(int n, ...)
{
va_list vl;
va_start(vl, 8);
if (i = 1; i <= n; i++)
{
strcpy(argvv[i], va_arg(vl, char *));
}
va_end(vl);
parseArgs(n, argvv);
...
}
在另一个文件中,我定义:
void parseArgs(int argc, char **argv)
{
printf("arg1:%s\n", argv[1]);
/* ????? I know this is not right; how to access the second argument */
}
答案 0 :(得分:3)
对va_start()
的调用是错误的;它应该是:
va_start(vl, n);
此后,您可以像使用va_arg()
一样使用。{/ p>
您的parseArgs()
函数应声明为:
void parseArgs(int argc, char argv[][32]);
并适当定义。你没有传递指针指针;你正在传递一个2D字符数组,这是完全不同的。如果您在parseArgs()
中调用范围func()
,则会从编译器中获得转换错误。
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
void parseArgs(int argc, char argv[][32]);
char argvv[8][32];
static int func(int n, ...)
{
va_list vl;
va_start(vl, n);
for (int i = 0; i < n; i++)
strcpy(argvv[i], va_arg(vl, char *));
va_end(vl);
parseArgs(n, argvv);
return n;
}
void parseArgs(int argc, char argv[][32])
{
for (int i = 0; i < argc; i++)
printf("arg%d:%s\n", i, argv[i]);
}
int main(void)
{
func(3, "abc", "def", "ghi");
return 0;
}
答案 1 :(得分:2)
我已在代码中用注释标记了我所更改的内容。
char argvv[8][32];
int func(int n, ...)
{
va_list vl;
int i;
va_start(vl, n); // Changed this line
if (i = 0; i < n; i++) // Changed this line
{
strcpy(argvv[i], va_arg(vl, char *));
}
va_end(vl);
parseArgs(n, argvv);
...
}
void parseArgs(int argc, char argv[][32]) // Changed this.
{
//argv[1] is the 2nd argument - argv[0] is the first
printf("arg1:%s\n", argv[1]);
}
C数组以0索引开头。
答案 2 :(得分:1)
void parseArgs(int argc, char **argv)
{ for (int i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
}