2012-02-06 59 views
3

因此,我正在研究一个基于Linux的命令行实用程序,它必须接受几个标志,并且我注意到了一些有趣的行为。我将发布我在主实用程序之外使用的测试代码。我正在使用这段代码,所以我不必改变实际的工具,直到我有可以插入的工作代码。因此,这里是我一直在摆弄的代码:argc,argv及其用法的有趣观察

#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]或第一个参数字符串的元素0。

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

  1. 到底是该语句在干什么?
  2. 无论我尝试什么,为什么我不能回到argv [0]或argv [0] [0]?
  3. 正在将argv [0]指向的地址的值存储在另一个char *中,这是我能够在此处访问该值的唯一方式,这是正常的解决方法吗?

我现在非常困惑,并且尝试了所有我能想到的方法来解决这个问题。有一次我有一个打印字母表的循环,我不知道该程序正在访问什么内存部分。最有趣的排列是从某个地方抽取sshid变量。

非常感谢大家的帮助。

回答

6

++argvargv更改为指向下一个参数。

尝试像

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

它保持,而不是覆盖argv一个单独的索引。

或者

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

其运作和原来一样,不同的是它改变了argv代替原有的副本。

+0

那么我的假设是正确的。这是常见的事情吗?我以前没有遇到过这个问题。 – Brandon 2012-02-06 05:40:23

+3

这只是在* C *中增加数组指针的语义。它没有什么特定的程序参数传递。 – 2012-02-06 05:43:02

+0

我想说这是相当常见的用法。对于(i = 0; i 2012-02-06 05:46:44