为什么我们使用 argc -1?

问题描述

这是一个反转给定参数的函数,为什么我们在这种情况下使用argc - 1,只要int类型中没有空值进行比较,是否从计数中减去文件名?如果你能展示 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