对argc,argv及其用法的有趣观察

时间:2012-02-06 05:24:34

标签: c linux pointers argv

所以,我正在研究基于Linux的命令行实用程序,它必须接受一些标志,我注意到了一些有趣的行为。我将发布我在主实用程序之外使用的测试代码。我正在使用这段代码,所以在我可以插入工作代码之前,我不必改变实际的实用程序。所以这是我一直在摆弄的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    while(--argc && (*++argv)[0] == '-') 
        putchar('*');

    printf("\n%s\n", argv[0]);
 }   

请忽略这样一个事实:所有这个程序都打印星号,并在使用一个参数-b调用时打印自己的名称。打印星号只是为了表明循环运行一次。所以,我在终端中以“./test -n”运行它,我期望输出为:

*。/测试

令我惊讶的是,输出结果是:

* - B

我有一个关于声明的工作理论 (*++argv)[0]正在做,但我仍然有点朦胧。我的假设是它遍历指针数组,查看指向的每个字符串中的第一个字符,(*++argv)[0]现在解除引用*argv[0]或第一个参数字符串的元素零。

所以,基本上我有三个问题:

  1. 该声明到底在做什么?
  2. 为什么我不能回到argv [0]或argv [0] [0],无论我尝试什么?
  3. 将值存储在argv [0]指向的地址中的另一个char *中,这是我此时能够访问该值的唯一方法,这是正常的方法吗?
  4. 此刻我对此感到非常困惑,并尝试了我能想到的一切来解决这个问题。有一次我有一个打印字母表的循环,我不知道程序访问的内存部分。最有趣的排列是从某个地方提取sshid变量。

    先谢谢大家的帮助。

1 个答案:

答案 0 :(得分:6)

++argv更改argv以指向下一个参数。

尝试类似

的内容
int i = 0;
while(--argc && argv[++i][0] == '-')

其中维护一个单独的索引,而不是覆盖argv

或者

char** argp = argv;
while(--argc && (*++argp)[0] == '-')

与原作相同,但它会更改argv的副本而不是原始副本。