2

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

7 回答 7

2

对于第一个问题,很可能__MCACHEFS_VERSION__是字符串文字的宏。在 C 中,如果它们之间没有任何内容,则将字符串文字连接起来。

对于第二个问题,argv[1][0]是指传递给函数的第一个参数的第一个字符(例如,如果您键入命令myprogram -la,则myprogram可以从 argv[0] 访问,并且-la将在 中argv[1])。argv[0]是可执行文件的名称,因此可执行文件的参数将来自索引 1。

因此,代码检查是否argc == 1表示没有传入参数,或者argv[1][0] == '-'表示第一个参数类似于标志,并返回错误。这里的逻辑是:我们先检查参数个数,如果参数个数不是1(逻辑运算符的短路效应),那么我们检查第一个参数。

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

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

  2. 正如其他人所指出的,argv[1]是字符串数组中的第二个字符串argv,字符串是字符数组,argv[1][0]第二个字符串中的第一个字符也是。

于 2012-08-01T11:13:54.340 回答
1

表示第二个字符串的第一个字符argv

于 2012-08-01T11:10:43.900 回答
1

这将确定第一个参数的第一个字符是否为破折号。

因此对于

command -firstparam

(argc == 1 || argv[1][0] == '-') 将评估为真。

于 2012-08-01T11:10:54.603 回答
1

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

表达方式

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

依赖于语言短路评估来保护数组取消引用。换句话说,如果测试argc == 1失败,则argv[1][0]不会评估后续表达式。如果是这样,那么取消引用可能会导致段错误。

printf 中的表达式依赖于 C 语言对字符串文字连接的支持。宏__MCACHEFS_VERSION__将在某处被#defined 为字符串文字。它允许您跨新行拆分字符串,或在宏中使用它们,如示例中所示。有关字符串文字连接的更多示例,请参见此处:http ://en.wikipedia.org/wiki/C_syntax#String_literal_concatenation

于 2012-08-01T11:14:38.857 回答
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];

于 2012-08-01T11:19:06.233 回答
1

argv 是一维数组。它的元素是字符指针。所以 argv[i] 给出了一个指向内存中 char 的指针。argv 中的值指向程序名称的第一个字符(以 ac null 结尾的“字符串”)以及传递给程序的任何附加参数。

argv[0] -------> my_program
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 */
于 2012-08-01T11:32:59.733 回答