gpt4 book ai didi

c - (*++argv)[0] 和 while(c = *++argv[0]) 的区别

转载 作者:太空狗 更新时间:2023-10-29 16:36:43 28 4
gpt4 key购买 nike

我有以下代码片段:

int main(int argc, char *argv[])
{

char line[MAXLINE];
long lineno = 0;
int c, except = 0, number = 0, found = 0;

while(--argc > 0 && (*++argv)[0] == '-') //These two lines
while(c = *++argv[0]) //These two lines
switch(c) {
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("find: illegal option %c\n", c);
argc = 0;
found = -1;
break;
}

...
}

包含以下表达式:

while(--argc > 0 && (*++argv)[0] == '-')

括号 (*++argv)[0] 中的表达式与不带括号的 while(c = *++argv[0]) 有区别吗?

如果可以,怎么做? (*++argv) 是否表示指向下一个参数的指针,*++argv[0] 是否表示指向当前 char 数组中的下一个字符的指针被指着?

最佳答案

首先,K&R 对这个特定片段有一个勘误表:

117(§5.10): In the find example, the program increments argv[0]. This is not specifically forbidden, but not specifically allowed either.

现在开始解释

假设您的程序名为 prog,您执行它时使用:prog -ab -c Hello World。您希望能够解析参数以表明指定了选项 abc,以及 HelloWorld 是非选项参数。

argvchar ** 类型——记住函数中的数组参数与指针相同。在程序调用时,事情看起来像这样:

                 +---+         +---+---+---+---+---+
argv ---------->| 0 |-------->| p | r | o | g | 0 |
+---+ +---+---+---+---+---+
| 1 |-------->| - | a | b | 0 |
+---+ +---+---+---+---+
| 2 |-------->| - | c | 0 |
+---+ +---+---+---+---+---+---+
| 3 |-------->| H | e | l | l | o | 0 |
+---+ +---+---+---+---+---+---+
| 4 |-------->| W | o | r | l | d | 0 |
+---+ +---+---+---+---+---+---+
| 5 |-------->NULL
+---+

这里,argc为5,argv[argc]NULL。一开始,argv[0] 是一个包含字符串 "prog"char *

(*++argv)[0]中,由于括号的原因,argv先递增,然后解引用。增量的效果是将 argv ----------> 箭头“向下移动一个 block ”,指向 1。解除引用的作用是获得指向第一个命令行参数 -ab 的指针。最后,我们取这个字符串的第一个字符([0] in (*++argv)[0]),测试它是否是'-',因为它表示选项的开始。

对于第二个构造,我们实际上想要遍历当前 argv[0] 指针所指向的字符串。所以,我们需要把argv[0]当作一个指针,忽略它的第一个字符(也就是我们刚才测试的'-'),再看其他字符:

++(argv[0]) 将递增 argv[0],以获得指向第一个非 - 字符的指针,并取消引用它会给我们那个角色的值(value)。所以我们得到 *++(argv[0])。但由于在 C 中,[]++ 绑定(bind)得更紧密,我们实际上可以去掉括号并得到我们的表达式 *++argv[0 ]。我们要继续处理这个字符,直到它为0(上图中每一行的最后一个字符框)。

表达式

c = *++argv[0]

将当前选项的值赋给c的值为cwhile(c)while(c != 0) 的简写,所以 while(c = *++argv[0]) 行基本上是将当前选项的值分配给 c 并测试它以查看我们是否已到达当前命令行参数的末尾。

在此循环结束时,argv 将指向第一个非选项参数:

                 +---+         +---+---+---+---+---+
| 0 |-------->| p | r | o | g | 0 |
+---+ +---+---+---+---+---+
| 1 |-------->| - | a | b | 0 |
+---+ +---+---+---+---+
| 2 |-------->| - | c | 0 |
+---+ +---+---+---+---+---+---+
argv ---------->| 3 |-------->| H | e | l | l | o | 0 |
+---+ +---+---+---+---+---+---+
| 4 |-------->| W | o | r | l | d | 0 |
+---+ +---+---+---+---+---+---+
| 5 |-------->NULL
+---+

这有帮助吗?

关于c - (*++argv)[0] 和 while(c = *++argv[0]) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2020945/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com