我正在学习C并注意到,如果对于简单的程序(比如打印某些东西或其他简单的东西),即使我删除了主程序中的参数,它仍然可以工作,但是我所关注的书将这些参数放在每个程序中。
#include <stdio.h>
int main(int argc, char const *argv[])
// even works if i do int main()
{
/* write your code here */
return 0;
}
我想了解这些论点的原因,为什么我们把它们和它们用于什么?也许指出一个程序的例子,如果我们从main函数中删除这些参数并指出它们的目的是什么,那么程序将无法工作?
答案 0 :(得分:8)
主要的签名是:
int main(int argc, char **argv);
其中argc
是传入的命令行参数的数量,包括用户调用的程序的实际名称。
argv
包含实际参数,从索引1开始,因为索引0
是程序名称。
所以,如果你运行这样的程序:
./program hello world
然后:
argc
将是3
。
argv[0]
将是./program
。
argv[1]
将是hello
。
argv[2]
将是world
。
我希望这对你来说足够清楚了。
答案 1 :(得分:2)
C中main
的允许定义是:
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
如果您不在程序中使用argc
或argv
参数,则可以使用第一个定义。这些参数用于检索参数的数量(argc
)及其内容(argv
),以防您在命令行中使用参数调用程序。
例如:
./a.out argument1 argument2
argc
的值为3
,而argv
对象就好像这样定义:
char *argv[] = {"./a.out", "argument1", "argument2", NULL};
答案 2 :(得分:1)
执行程序时,传递给C中main方法的参数来自命令行。
使用命令行参数作为将输入信息从用户传递到程序的机制时,可以添加它们。
如果没有命令行参数并且什么也没有传递,程序仍然可以工作。在这种情况下,代码必须从另一个源获取所有输入信息(例如,从文件中读取)。
答案 3 :(得分:1)
主函数的参数是您在命令行上键入的程序,以便程序执行。我们一个一个地看看它们。
int argc
:参数count的缩写,这是argv数组中第二个参数的C字符串数。
char *argv[]
:这是字符串数组。第一个字符串是编译程序时生成的二进制可执行文件的名称。其余的字符串是该程序的参数。
所以,时间是一个例子。遵循简单的程序(让我们称之为 add )将两个整数作为命令行参数,打印它们的总和并退出。为了保持这一点,该程序执行最少的错误检查。
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int a, b, sum;
if(argc != 3) // program name + the two arguments
{
return -1;
}
a = atoi(argv[1]);
b = atoi(argv[2]);
sum = a + b;
printf("Sum is: %d\n", sum);
return 0;
}
编译时,可以使用以下命令执行该程序:
$ ./add 25 31
其中:argv[0]
添加
argv[1]
25
argv[2]
31
而argc
是3
没有参数的主方法如何工作?
不需要命令行参数argc
和argv
。所以你可以完美地拥有这样的程序:
int main()
{
// other code here...
return 0;
}
只需要将程序中的一个方法命名为main
(使用两个已识别的签名之一:int main()
或int main(int argc, char *argv[])
)。运行程序的操作系统将找到该方法并从那里开始执行程序(尽管程序的实际起点是不同的系统定义例程)。
答案 4 :(得分:1)
与任何函数参数一样,目的不是使调用代码工作,而是提供被调用函数需要的数据才能正常运行。
对于main
函数,调用环境告诉程序在命令行上给出了哪些选项。具体来说,第一个参数(传统上将argc
命名为&#34;参数计数&#34;)是多少&#34;字&#34;包含的命令,第二个(argv
,对于&#34;参数向量&#34;),是该长度的数组(向量),包含单词本身作为标准的以空字符结尾的字符串。
因此,当您键入&#34; rm -rf /&#34;时,rm
程序会收到argc
的3,以及argv
包含&#34; rm& #34;,&#34; -rf&#34;和&#34; /&#34;。然后,它可以解释这些参数,以便知道您要删除整个系统上的所有内容。
传递命令本身的名称可能看起来很奇怪,但实际上相当有用。例如,true
命令的工作是&#34;什么也不做,成功&#34; (立即退出状态为0),而false
应该&#34;什么都不做,不成功&#34; (以0以外的状态退出)。这些都可以使用符号链接指向同一个程序,并且该程序可以根据argv[0]
的值来决定是否成功。
更详细的示例是编辑器vim
,可以通过使用view
(只读),vimdiff
等名称调用它来启动各种默认选项(比较两个)文件并排),rvim
(限制模式),ex
(模拟更简单的前任),依此类推。这些选项以及更多选项也可以指定为额外的参数,因此可能有很多代码只是&#34;阅读&#34; argv
。
由于您并不总是关心使用了哪些参数,因此允许定义没有参数的main
。然后将忽略命令行上的参数,并且您的命令将只运行。
答案 5 :(得分:0)
因此,您可以在从命令行调用程序时传递参数。想象一下任何接收参数的命令行工具,例如rm用于删除文件,通常你喜欢这样:
$ rm file1
所以,如果二进制文件是&#34; rm&#34;,&#34; file1&#34;将是第一个参数。所以argc值增加1(这是知道有多少参数传递给二进制文件的方法),而argv [1]包含字符串&#34; file1&#34;。
您可以想象在调用时接收任何参数的任何其他二进制文件。
答案 6 :(得分:0)
从命令行执行程序时使用它们。 argc具有参数的数量,而argv是字符串形式的单个参数