关于main函数参数的一点思考

 

 先看看由VC6自动生成的Hello World程序代码:

 1 // hello world.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5
6 int main(int argc, char* argv[])
7 {
8 printf("Hello World!\n");
9 return 0;
10 }

  刚学C语言的时候,书上的Hello World程序的main函数也是带参的,当时老师告诉我们:这个你们先别管,以后会懂的。然后就轻轻带过了,到后来写出程序的时候,main函数总是作为主调函数,貌似也没有带参的必要,也就慢慢忘了这回事,几乎都不记得main其实是有参数的,前两天看《C Primer Plus》文件与I/O库那一章的时候,发现里面的举例程序都要判断main函数的参数。

  上网查了一下

main函数参数的设置及作用函数的参数用来在函数调用时,往被调用函数传递数据,而main函数在C程序中,不被任何函数所调用,那main函数的参数从何处得到数据呢?每一个C程序的执行都是在系统的支持下进行的,main函数是系统执行相就的程序得到“调用”,从系统命令行中得到相应的参数。

main函数有两个参数,其中第一个参数的类型为整型,用于指出命令行中字符串的个数;第二个参数是一个字符指针数组,分别指向命令行中各个字符串,其一般形式为:main(intargc,char*argv[]);其中,变量的名字可以根据程序人员的爱好进行改变,但参数的数目及各参数的类型是不可改变的,如有一个程序文件为file_cpy.exe,如果执行时,命令行为:file_cpys_fd_f,则参数argc得到值3,而argv[0]、argv[1]、argv[2]分别指向字符串“file_cpy”、“s_f”、“d_f”。

我们函数名后面的括号是用来传递参数的;通常是一个函数向另外一个函数传入参数,而得到一个返回值或一系列的操作,用网友的话就是谁调用,谁传参;main()与其他函数的特殊性在于,没那个函数可以向它传入参数,因为它是入口点,那这个参数表有什么用呢?还是那句话,谁调用,谁传参,main函数其实是让用户来调用的,所以用户会给它传入参数,main()并不是说用户没有传入任何参数,而是指用户传入的参数就是只有程序的名字,这情况下,一般不需要进行特殊处理,可以当作什么也没有传入,即为main(void)用过MS-DOS或linux,unix的人知道在命名行下,很多的命名有许多的开关,通过在同一个程序名后输入不同的开关,就可以执行不同的命名了,这是如何实现的呢,其实就是通过检查用户传入的除程序名的之外的其它数据来选择该执行什么命名的,argc记录用户传入参数的总的个数,argv会存储所有的参数的索引,方便程序调用分析。所以通常可以在main()函数内书写对用户的命令行输入进行检查的代码,对argv中的开关进行一一分析,就可执行相应的功能,当然这此功能,你又可以将其分解成一个个的函数,然后让main调用了;通常命名行下的许多命令都有很多的参数选项,就是通过main()的参数列表来实现的。

  其实只是一个很简单的问题,但是以前都没注意到,其实VC6在生成代码时上面有一行注释

  Defines the entry point for the console application.

  翻译过来是:定义控制台应用程序入口点。这貌似也说明了main函数是由控制台调用的吧,自然的参数也就和控制台有关。

  其实归根到底原因还是平时思考太少,碰到一些问题都不去深入思考,思维惰性。  

 

更新日志:

2013年1月4日20:46:04

  最近看《linux程序设计》,恍然大悟,这参数的作用就是通过定义不同的参数,在控制台调用程序的时候输入不同的参数可以执行不同的功能。

  比如 ls 命令:

  ls   ——默认格式显示当前目录文件

  ls -l  ——以长格式显示文件属性

  ls -al ——以长格式显示所有文件,包括隐藏文件。

  linux下一个命令就是一个程序,通过控制台向main函数传参,来执行不同代码块以实现不同的功能。

转载于:https://www.cnblogs.com/MuyouSome/archive/2012/12/18/2821031.html

<think>好的,我现在要详细解释C语言中main函数的参数argc和argv的用法和含义。用户已经提供了四个相关的引用内容,我需要综合这些信息,并按照用户的要求结构化回答。 首先,我需要明确argc和argv的基本定义。根据引用[3],C语言规定main函数的参数只能有两个,即int argc和char *argv[]。argc表示参数的数量,而argv是一个字符串数组,存储具体的参数内容。用户可能需要知道这些参数是如何传递的,以及如何在程序中访问它们。 接下来,我需要解释参数的具体含义。引用[4]提到,argv[0]通常是程序名,实际参数从argv[1]开始。这一点很重要,因为很多新手可能会误以为第一个参数是用户输入的。需要举例说明,比如用户运行程序时输入的命令行参数,如何被解析到argv数组中。 然后,需要讨论参数的传递方法。根据引用[2],可以通过命令行或IDE配置来传递参数。用户可能想知道在不同的开发环境中如何设置这些参数,例如在VS Code或Visual Studio中如何配置命令行参数。这部分可能需要分步骤说明,帮助用户实际操作。 类型转换也是一个关键点,因为argv中的参数都是字符串类型。引用[4]指出需要根据需求进行转换,比如将字符串转换为整数或浮点数。这里需要举例说明,例如使用atoi或strtol函数进行转换,并强调错误处理的重要性,避免无效输入导致程序崩溃。 注意事项部分,需要强调参数个数的检查,避免越界访问。引用[4]提到使用argc来确保参数足够,这样可以防止程序因缺少参数而出现错误。此外,可能还需要提到不同操作系统对参数处理的差异,比如在Linux和Windows中的细微差别。 示例代码是帮助理解的重要部分。引用[1]和[2]都提供了代码示例,我需要整合这些例子,展示如何遍历参数并进行处理。同时,要确保代码格式正确,符合用户要求的语法高亮,并添加注释解释关键步骤。 最后,生成相关问题时要考虑用户可能的进一步疑问,比如参数传递的其他方法、如何处理多个参数类型,或者在不同平台下的兼容性问题。这些问题需要与主题紧密相关,帮助用户深入学习。 总结整个思考过程,我需要确保回答结构清晰,分点解释,结合代码示例和实际应用场景,同时引用提供的参考资料来增强答案的可信度。此外,要注意使用中文,正确应用LaTeX格式,并遵循用户提供的系统级指令。</think>### C语言main函数参数详解 #### 一、基本定义 main函数的标准参数形式为: $$int\ main(int\ argc,\ char\ *argv[])$$ - $argc$:参数计数(argument count),表示命令行参数的总个数,类型为整数 - $argv$:参数向量(argument vector),是存储参数字符串的指针数组,每个元素对应一个命令行参数 #### 二、参数解析 1. **参数位置规则**: - $argv[0]$ 始终是程序名称 - 用户输入参数从 $argv[1]$ 开始 - $argc$ 最小值是1(仅包含程序名) 2. **参数关系**: $$argc = sizeof(argv)/sizeof(argv[0])$$ 3. **内存结构示例**: ``` ./a.out file1.txt -o output → argc=4 argv[0] → "./a.out" argv[1] → "file1.txt" argv[2] → "-o" argv[3] → "output" ``` #### 三、参数传递方法 1. **命令行直接传递**: ```bash ./program arg1 "arg 2" 3.14 ``` 2. **开发环境配置**(以VS Code为例): 1. 打开launch.json配置文件 2. 在args数组中添加参数: ```json "args": ["input.txt", "--debug", "100"] ``` #### 四、类型转换示例 ```c #include <stdlib.h> // 将字符串转换为整数 int num = atoi(argv[1]); // 带错误检查的转换 char *endptr; long value = strtol(argv[2], &endptr, 10); if (*endptr != '\0') { printf("参数 %s 不是有效数字\n", argv[2]); exit(1); } ``` #### 五、完整示例代码 ```c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("参数总数:%d\n", argc); for(int i=0; i<argc; i++){ printf("参数 %d: %s\n", i, argv[i]); } if(argc < 3){ fprintf(stderr, "用法:%s <文件名> <模式>\n", argv[0]); return EXIT_FAILURE; } // 实际参数处理逻辑 FILE *fp = fopen(argv[1], "r"); int mode = atoi(argv[2]); // ... return 0; } ``` #### 六、注意事项 1. **参数验证**必须包含: ```c if(argc < 必需参数数+1) { // 显示用法提示 } ``` 2. **特殊字符处理**:带空格的参数需要用引号包裹 3. **系统差异**:Windows系统下路径分隔符使用`\`需要转义为`\\` #### 七、进阶用法 1. **环境变量访问**: ```c extern char **environ; // 环境变量指针数组 ``` 2. **第三方参数解析库**: - getopt(POSIX标准) - argp(GNU扩展)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值