问题描述
这是一个反转给定参数的函数,为什么我们在这种情况下使用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]);
}
}
,
我阅读了之前的答案,我注意到他们试图为您提供另一种重写代码的方法,而不是我将向您解释 argc
和 argv
的工作原理。>
你可能会注意到为什么我们在主函数中声明参数,我们这样做:
int main(int argc,char **argv
这意味着当您尝试启动可执行程序时,您应该给它一些附加参数。
-
argc
是从命令行传递给程序的参数数量 -
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