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

时间:2012-08-01 11:08:45

标签: c

我正在阅读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[]代表命令行中的参数。但是,它不是 one dimension 数组吗?

7 个答案:

答案 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)

  1. 当C编译器看到很多字符串文字彼此相邻时,它会将它们连接成一个长字符串。因此,只要宏printf()扩展为字符串,就可以使用__MCACHEFS_VERSION__。该字符串最好不包含任何百分比字符......我将其写为

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

  2. 正如其他人所指出的,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)

  1. __MCACHEFS_VERSION__是字符串文字的宏,例如"1.0"。当相邻放置多个字符串文字时,它们会连接在一起:"Version:" __MCACHEFS_VERSION__ "..."在这种情况下会变为"Version: 1.0..."

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