为什么我们使用 argc -1?

Why we use argc -1?

这是一个给定参数取反的函数,这里为什么要用argc - 1,只要int类型没有null可以比较,是不是要从count中减去文件名?如果您能展示 argc - 1 的其他用途,那就太好了。

int     main(int argc, char **argv)
{
    int i;

    i = argc - 1;
    while (i > 0)
    {
        printf("%s", argv[i]);
        putchar('\n');
        i--;
    }
    return (0);
}

就是代码写的不好,没什么值得学习和借鉴的。通过应用常识,我们可以将其重写为:

for(int i=1; i<argc; i++)
{
  puts(argv[argc-i]);
}

假设我们不想打印 argv[0].

为了比较,这里还有两种写相同循环的方法。

方法二:

int main(int argc, char **argv)
{
    int i;
    for(i = argc - 1; i > 0; i--)
    {
        printf("%s\n", argv[i]);
    }
}

方法三:

int main(int argc, char **argv)
{
    int i = argc;
    while(--i > 0)
    {
        printf("%s\n", argv[i]);
    }
}

我阅读了之前的答案,我注意到他们试图为您提供另一种重写代码的方法,而我将向您解释 argcargv 的工作原理。

您可能会注意到我们为什么要在主函数中声明参数,我们这样做:

int main(int argc, char **argv

这意味着当您尝试启动可执行程序时,您应该给它一些额外的参数。

  1. argc 是从命令行传递给程序的参数数量
  2. argv 是参数数组。

你应该知道数组从 0 开始,这意味着如果你想打印数组中的最后一个参数,你可以这样做:

printf("%s\n", argv[argc - 1]);

例如:

我有一个程序,它接受一个参数列表并一个一个地打印每个参数后跟换行符 \n

代码:

#include <unistd.h>

int main(int argc, char **argv)
{
    int i;
    int j;

    while (argv[i])
    {
        j = 0;
        while (argv[i][j])
        {
            write(1, &argv[i][j], 1);
            j++;
        }
        write(1, "\n", 1);
        i++;
    }
}

注意:此程序不使用任何内置函数(wite除外)。

如果您尝试编译并执行此代码:

➜  Desktop gcc test.c 
➜  Desktop ./a.out test test1 test2
./a.out
test
test1
test2
➜  Desktop