我正在阅读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[]
代表命令行中的参数。但是,它不是 one dimension 数组吗?答案 0 :(得分:2)
对于第一个问题,__MCACHEFS_VERSION__
很可能是字符串文字的宏。在C中,如果它们之间没有任何内容,则串联字符串文字。
对于第二个问题,argv[1][0]
引用传递给函数的第一个参数的第一个字符(例如,如果键入命令myprogram -la
,则可以从argv访问myprogram
[ 0],-la
将在argv[1]
)。 argv[0]
是可执行文件的名称,因此可执行文件的参数将来自索引1。
因此,代码检查是否argc == 1
,这意味着没有传入参数,或argv[1][0] == '-'
,这意味着第一个参数类似于标志,并返回错误。这里的逻辑是:我们首先检查参数的数量,如果参数的数量不是1(逻辑运算符的短路效应),那么我们检查第一个参数。
答案 1 :(得分:2)
当C编译器看到很多字符串文字彼此相邻时,它会将它们连接成一个长字符串。因此,只要宏printf()
扩展为字符串,就可以使用__MCACHEFS_VERSION__
。该字符串最好不包含任何百分比字符......我将其写为
printf("mcachefs %s starting up...\n", __MCACHEFS_VERSION__);
正如其他人所指出的,argv[1]
是字符串数组argv
中的第二个字符串,字符串是字符数组,因此argv[1][0]
是第二个字符串中的第一个字符
答案 2 :(得分:1)
它表示第二个字符串argv
的第一个字符。
答案 3 :(得分:1)
这将确定第一个参数的第一个字符是否为破折号。
所以
command -firstparam
(argc == 1 || argv [1] [0] ==' - ')将评估为真。
答案 4 :(得分:1)
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
答案 5 :(得分:1)
__MCACHEFS_VERSION__
是字符串文字的宏,例如"1.0"
。当相邻放置多个字符串文字时,它们会连接在一起:"Version:" __MCACHEFS_VERSION__ "..."
在这种情况下会变为"Version: 1.0..."
。
argv[1][0]
是指第二个元素的第一个元素。它相当于:
const char* firstArg = argv[1];
char firstCharOfFirstArg = firstArg[0];
答案 6 :(得分:1)
argv是一维数组。它的元素是字符指针。所以argv [i]给出了一个指向内存中char的指针。 argv中的值指向程序名称的第一个字符(作为c null终止"字符串")以及传递给程序的任何其他参数。
argv [0] -------> MY-
argv [1] -------> -some_arg
要获取argv元素指向的字符,您可以使用取消引用运算符:
* 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 */