2012-02-06 31 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