簡體   English   中英

argv [1] [0]是什么意思?

[英]What is the meaning of argv[1][0]?

我正在閱讀mcachefs代碼,無法理解一些代碼,如下所示:

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[]代表命令行中的參數。 但是,它不是一維數組嗎?

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

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

因此代碼檢查argc == 1 ,這意味着沒有傳入參數,或者argv[1][0] == '-' ,這意味着第一個參數類似於標志,並返回錯誤。 這里的邏輯是:我們首先檢查參數的數量,如果參數的數量不是1(邏輯運算符的短路效應),那么我們檢查第一個參數。

  1. 當C編譯器看到很多字符串文字彼此相鄰時,它會將它們連接成一個長字符串。 因此,只要宏__MCACHEFS_VERSION__擴展為字符串,就可以使用printf() 該字符串最好不包含任何百分比字符......我會把它寫成

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

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

它表示第二個argv字符串的第一個字符。

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

因此對於

command -firstparam

(argc == 1 || argv [1] [0] ==' - ')將評估為true。

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

表達方式

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

依賴於語言短路評估來安全地獲取陣列解除引用。換句話說,如果測試argc == 1失敗,則后續表達式argv[1][0]不會被證明。 如果是那么derefence可能會導致段錯誤。

printf中的表達式依賴於C語言對字符串文字串聯的支持。 __MCACHEFS_VERSION__將在某處作為字符串文字#defined。 它允許您跨新行拆分字符串,或在宏中使用它們,如示例所示。 有關字符串文字串聯的更多示例,請參見此處: http//en.wikipedia.org/wiki/C_syntax#String_literal_concatenation

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

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

    const char* firstArg = argv[1];

    char firstCharOfFirstArg = firstArg[0];

argv是一維數組。 它的元素是字符指針。 所以argv [i]給出了一個指向內存中char的指針。 argv中的值指向程序名稱的第一個字符(作為ac null終止“string”)以及傳遞給程序的任何其他參數。

argv [0] -------> my_program
argv [1] -------> -some_arg

要獲取argv元素指向的字符,可以使用dereference運算符:

* argv的[1]

或者,C還允許數組語法取消引用指針:
argv [1] [0] / *取消引用存儲在argv中的指針[1] * /

如果字符指針在argv數組之外使用可能會更清楚:

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 */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM