在C中的主要参数
我不知道该怎么办! 我对C基础知识非常了解。 结构,文件IO,string等。 出于某种原因,我不能理解这个概念。 任何build议,帮助或build议。 PS我是一个Linux用户
main
签名是:
int main(int argc, char **argv);
argc
是指传入的命令行参数的数量,其中包含用户调用的程序的实际名称。 argv
包含从索引1开始的实际参数。索引0是程序名称。
所以,如果你像这样运行你的程序:
./program hello world
然后:
- argc会是3。
- argv [0]将是“./program”。
- argv [1]将是“你好”。
- argv [2]将是“世界”。
为了parsingposix系统上的命令行参数,标准是使用库例程的getopt()
系列来处理命令行参数。
一个很好的参考是GNU getopt手册
Siamore,我不断地看到每个人都使用命令行来编译程序。 我通过code :: blocks,在我的Linux机器上使用gnu gcc编译器,从ide使用x11terminal。 我从来没有从命令行编译过程。 所以Siamore,如果我想程序名称是cp,我初始化argv [0] =“cp”; Cp是一个string文字。 和任何去标准输出在命令行? 你给我的例子Siamore我明白了! 即使你input的string只有几个字,但仍然只有一个参数。 因为它被包裹在双引号中。 所以arg [0],prog的名字,实际上是你的string,新的一行字符? 所以我明白你为什么使用if(argc!= 3)打印错误。 因为prog name = argv [0],之后还有2个参数,并且发生了一个错误。 我还有什么其他的理由呢? 我真的觉得我对于如何从命令行或terminal进行编译的理解不够,是我在这个领域缺乏理解的原因! Siamore,你帮我理解了Cla的好多了! 仍然不完全了解,但我不是没有注意到这个概念。 我要学习从terminal编译然后重新读你写的东西。 我敢打赌,那我就完全明白了! 多一点帮助从你大声笑
我没有写自己的代码,而是来自我的书。
#include <stdio.h> int main(int argc, char *argv[]) { int i; printf("The following arguments were passed to main(): "); for(i=1; i<argc; i++) printf("%s ", argv[i]); printf("\n"); return 0; }
这是输出:
anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man The follow arguments were passed to main(): hey man anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing? The follow arguments were passed to main(): hi how are you doing?
所以argv是一个string表格,argc是它们的数量。 现在argv [0]是程序的名字。 所以如果我input./CLA来运行程序./CLA是argv [0]。 上面的程序将命令行设置为无限量的参数。 我可以设置他们只需要3或4,如果我想要的。 像一个或你的例子显示,Siamore … if(argc!= 3)printf(“有些错误在这里”); 谢谢Siamore,没有你,不可能做到! 感谢他们的时间和精力的其余部分!
PS在未来有这样的问题…你永远不知道大声笑的问题是因为我使用的IDE AKA Code :: Blocks。 如果我要在上面运行该程序,它将打印程序的path/目录。 例如:〜/ Documents / C / CLA.c必须从terminal运行并使用命令行进行编译。 gcc -o CLA main.c,你必须在文件的目录中。
想象一下这样
*main() is also a function which is called by something else (like another FunctioN) *the arguments to it is decided by the FunctioN *the second argument is an array of strings *the first argument is a number representing the number of strings *do something with the strings
也许一个示例程序可以帮助。
int main(int argc,char *argv[]) { printf("you entered in reverse order:\n"); while(argc--) { printf("%s\n",argv[argc]); } return 0; }
它只是把你input的所有东西按相反的顺序打印出来,但你应该做一些更有用的新程序。
编译它(就像你好)从terminal运行它的参数
./hello am i here
然后尝试修改它,以便它试图检查如果两个string是否是相反的,那么您将需要检查argc参数是否恰好为三,如果有其他东西打印错误
if(argc!=3)/*3 because even the executables name string is on argc*/ { printf("unexpected number of arguments\n"); return -1; }
然后检查argv [2]是否与argv [1]相反并打印结果
./hello asdf fdsa
应该输出
they are exact reverses of each other
最好的例子是一个文件复制程序尝试它就像cp
cp file1 file2
cp是第一个参数(argv [0]不是argv [1]),大多数情况下你应该忽略第一个参数,除非你需要引用或者什么
如果你做了cp程序,你明白了主要的参数…
Main与其他函数一样,argc和argv就像任何其他函数参数一样,不同之处在于main从C运行时调用,并将parameter passing给main,但C运行时在c库中定义,不能修改因此,如果我们在shell或者某个IDE上执行程序,我们需要一个机制将parameter passing给main函数,这样主函数的运行时间可以根据您的参数而有所不同。 参数是argc,它给出了参数的个数,argv是指向数组的指针,它将值保存为string,这样就可以传递任意数量的参数而不会限制它,这是实现var args的另一种方式。
对@anthony代码做了一个小的改动,所以我们可以得到很好的格式化输出参数的数字和值。 当你有多个参数时,以某种方式更容易阅读输出:
#include <stdio.h> int main(int argc, char *argv[]) { printf("The following arguments were passed to main():\n"); printf("argnum \t value \n"); for (int i = 0; i<argc; i++) printf("%d \t %s \n", i, argv[i]); printf("\n"); return 0; }
和输出类似于:
The following arguments were passed to main(): 0 D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe 1 -P 2 TestHostAttoshiba 3 _http._tcp 4 local 5 80 6 MyNewArgument 7 200.124.211.235 8 type=NewHost 9 test=yes 10 result=output