[英]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
? 我從未見過如此使用它的方式。
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(邏輯運算符的短路效應),那么我們檢查第一個參數。
當C編譯器看到很多字符串文字彼此相鄰時,它會將它們連接成一個長字符串。 因此,只要宏__MCACHEFS_VERSION__
擴展為字符串,就可以使用printf()
。 該字符串最好不包含任何百分比字符......我會把它寫成
printf("mcachefs %s starting up...\\n", __MCACHEFS_VERSION__);
正如其他人所指出的那樣, 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
__MCACHEFS_VERSION__
是字符串文字的宏,例如"1.0"
。 當相鄰放置多個字符串文字時,它們會連接在一起: "Version:" __MCACHEFS_VERSION__ "..."
"Version: 1.0..."
在這種情況下將變為"Version: 1.0..."
。
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.