我正在编写一个C程序,它将采用可变数量的命令行参数。我需要接受这些参数并将它们传递给一个函数,该函数将可变数量的文件名作为单独的参数(使用va_arg获取函数内部的参数),原型为:
void FindFile(char *filename1, ...);
我对FindFile的实现很好。我的问题是,如何在main方法的'char * argv []'中获取可变数量的参数,并在调用FindFile时将它们用作参数?
这是一个类的赋值,因此无法更改FindFile原型。我一直在寻找方法来完成这项工作,只找到一个答案,说这是不可能的。实际情况如此吗?这是我的教授给出的确切规范,所以我认为它可能以某种方式,但确切的方法没有在课堂上讨论。
答案 0 :(得分:2)
不可能做什么(至少在K& R,ansi-c和c99以及禁止实现依赖技巧)是将选定的命令行参数附加到某种参数列表在运行时并将其传递给您的函数。太糟糕了,因为这是我想到的第一件事。
这使您的问题在于弄清楚您可以做什么。例如,您可以每次调用(给定的varidac函数)FindFile(fname, argc, argv);
。编写这样的代码而不仅仅是给FindFile
一个固定的签名是愚蠢的(真的,非常非常愚蠢的),但是FindFile
的给定的varargs版本可以编写来管理那个就好了。
如果您只想传递一些命令行参数,那么您将创建一个新的char*[]
,其中只包含您想要的参数并将其传递。
答案 1 :(得分:2)
我在my postscript interpreter中做过类似的事情。
这来自我的操作员处理函数。它使用switch语句通过函数指针进行可变参数调用。
call: /* pass args bottom-up */
tos = siq; /* pop the stack to the 'stack in question' */
/* room for output? */
if (tos-os + op.sig[i].out > OSSIZE) error(st,stackoverflow);
switch (op.sig[i].n) {
case 0: op.sig[i].fp(st); break;
case 1: op.sig[i].fp(st, siq[0]); break;
case 2: op.sig[i].fp(st, siq[0], siq[1]); break;
case 3: op.sig[i].fp(st, siq[0], siq[1], siq[2]); break;
case 4: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3]); break;
case 5: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4]); break;
case 6: op.sig[i].fp(st, siq[0], siq[1], siq[2], siq[3], siq[4], siq[5]); break;
default: error(st,unregistered);
}
我从Goswell interpreter (AKA Rutherford interpreter, AKA RALpage)借用了这项技术。