int
main(int argc,char **argv){
for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount) {
argCount = 1;
switch (argv[0][1]) {
case 'q':
testnum = atoi(argv[1]);
argCount++;
break;
default:
testnum = 1;
break;
}
}
//...............
我的问题是argv [0] [1]的意思是什么,而for()中的条件让我感到困惑,我的意思是for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)
//谢谢大家.... ** argv [0] [1]应该是argv [0] [1],这就是我的错误而不是代码编写者。
答案 0 :(得分:2)
该代码看起来不正确。 **argv[0][1]
尝试取消引用char
。
argv[0][1]
会有意义,并且意味着“取char
中第一个char*
的{{1}}。”恕我直言,代码试图检测argv
命令行标志(并随后将-q
设置为下一个参数的testnum
版本,盲目地假设它存在),但它正在跳过检查int
,并盲目地假设它在那里,并且没有其他参数会将-
作为第二个字符。
此代码需要重构。这是一种方式:
q
答案 1 :(得分:1)
argv[0]
表示在命令行上调用的程序名称。如果您输入./myprogram --help
,则argv[0]
将为“./myprogram”。
argv[0][1]
将是该字符串的第二个字符,在上面的示例中为“/”。
让我们看看for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)
:
它通过执行argc--
初始化循环,然后argv++
(argv
现在指向第二个用户参数字符串)并且argc声明参数更少。
循环适用于所有参数argc>0
,并且在每次迭代时,处理的参数argCount
的数量取自所有参数argc
的数量。这是有道理的。
但switch (**argv[0][1])
没有任何意义,argv[0][1]
是char
,如前所述,不是指针,因此无法取消引用。
答案 2 :(得分:0)
这段代码看起来很疯狂。我想你打算做以下事情:
int main(int argc,char **argv){
char** p = argv + 1; // skipping program name
while (*p != 0) { // over all parameters
testnum = 1;
if (*p[1] == 'q') { // skipping - of "-q", not a good idea
p ++;
if (*p != 0) { // may be null, read testnum from parameter,
// ?? no check whether this is an integer at all
testnum = atoi(*p);
}
}
}
(未经过测试,可能无法编译或工作)