2012-08-01 402 views
2

我讀的mcachefs代碼和無法理解的一些代碼,如下圖所示:argv [1] [0]是什麼意思?

printf("mcachefs " __MCACHEFS_VERSION__ " starting up...\n"); 

if (argc == 1 || argv[1][0] == '-') 
{ 
    fprintf(stderr, 
     "\tError : first argument shall be the the mcachefs_mountpoint !\n"); 
    exit(2); 
} 

我有兩個問題: 1:printf("mcachefs " __MCACHEFS_VERSION__ " starting up...\n"),是使用printf正確的方法是什麼?我從來沒有見過這樣的使用方式。

  1. argv[1][0]是什麼意思?我知道argv[]代表命令行中的參數。但是,是不是一維數組?

回答

2
  1. 當C編譯器看到大量字符串文字相鄰時,它將它們連接成一個長字符串。因此,只要宏__MCACHEFS_VERSION__擴展爲字符串,那麼使用printf()即可。該字符串最好不要包含任何百分號......我把它寫成

    printf("mcachefs %s starting up...\n", __MCACHEFS_VERSION__);

  2. 正如其他人所指出的那樣,argv[1]是字符串數組argv在第二個字符串,字符串的字符數組所以argv[1][0]是第二個字符串中的第一個字符。

+0

我覺得原來的方法比較好,因爲如果一些奇怪放置在宏編譯器會抱怨:如果字符指針用來argv數組外,可能再清楚不過了。使用這種方法,如果有人修改宏,您可能會打印垃圾/崩潰程序。 – nhahtdh 2012-08-01 11:16:54

+0

他應該仍然使用puts而不是printf – 2012-08-01 13:39:42

+0

@nhahtdh你可以打印垃圾或以原始方式崩潰程序,如果修改結束。 – 2012-08-01 13:58:51

1

這意味着第二個字符串argv的第一個字符。

1

這將確定第一個參數的第一個字符是否爲破折號。

所以對於

command -firstparam 

(的argc == 1周||的argv [1] [0] == ' - ')將評估爲真。

2

對於第一個問題,很有可能__MCACHEFS_VERSION__是字符串文字的宏。在C中,如果它們之間沒有任何內容,則字符串文字會被連接起來。

對於第二個問題,argv[1][0]指傳遞到函數的第一個參數的第一個字符(例如,如果鍵入然後myprogram可以從的argv [0]訪問的命令myprogram -la,和-la將在argv[1])。 argv[0]是可執行文件的名稱,因此,參數的可執行將從索引1

因此,代碼檢查是否argc == 1,這意味着沒有參數傳遞中,或argv[1][0] == '-',這意味着第一個參數是有點像標誌,並返回錯誤。這裏的邏輯是:我們首先檢查參數個數,如果參數個數不是1(邏輯運算符的短路效應),那麼我們檢查第一個參數。

1

argv[1][0]指的是第二個字符串的第一個字符。

表達

if (argc == 1 || argv[1][0])

依賴於語言短路評價安全-gaurd陣列dereference.In換句話說,如果那麼測試失敗argc == 1隨後表達argv[1][0]不evalauted。如果是的話,derefence可能會導致段錯誤。

printf中的表達式依賴於C語言對字符串文字連接的支持。宏__MCACHEFS_VERSION__將作爲#字符串文字定義的地方。它允許你跨新行分割字符串,或者像你的例子中所示的那樣在宏中使用它們。在這裏看到字符串文字級聯的多個例子:http://en.wikipedia.org/wiki/C_syntax#String_literal_concatenation

1
  1. __MCACHEFS_VERSION__爲字符串文字,例如一個宏"1.0"。當多個字符串文字相鄰放置時,它們被連接起來:在這種情況下,"Version:" __MCACHEFS_VERSION__ "..."將變爲"Version: 1.0..."

  2. argv[1][0]指的是第二個元素的第一個元素。它等效於:

    const char* firstArg = argv[1];

    char firstCharOfFirstArg = firstArg[0];

1

argv的是一個一維數組。它的元素是字符指針。所以argv [i]給出一個指向內存中char的指針。 argv中的值指向程序名稱的第一個字符(作爲c空終止的「字符串」)以及傳遞給程序的任何附加參數。

的argv [0] -------> MY-
的argv [1] -------> -some_arg

要獲得由argv的元件你指出於字符可以使用引用操作:

* argv的[1]

或,C還允許陣列語法來解除引用的指針:
的argv [1] [0]/*取消引用存儲在的argv [指針1] */

char *arg1 = argv[1] 

printf("first char of the first arg is %c\n",*arg1); /* dereference char pointer */ 
printf("another way to access first char of %c\n",arg1[0]); /* dereference char pointer */