该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助.
一.main()函数参数
通常我们在写主函数时都是void main()或int main() {..return 0;},但ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99中main()函数主要形式为:
(1).int main(void)
(2).int main(int argc,char *argv[]) = int main(int argc,char **argv).
其参数argc和argv用于运行时,把命令行参数传入主程序.其中ARG是指arguments,即参数.具体含义如下:
(参照Arguments to main和C++ Primer7.2.6节)
(1).int argc:英文名为arguments count(参数计数)
count of cmd line args,运行程序传送给main函数的命令行参数总个数,包括可执行程序名,其中当argc=1时表示只有一个程序名称,此时存储在argv[0]中.
(2).char **argv:英文名为arguments value/vector(参数值)
pointer to table of cmd line args,字符串数组,用来存放指向字符串参数的指针数组,每个元素指向一个参数,空格分隔参数,其长度为argc.数组下标从0开始,argv[argc]=NULL.
argv[0] 指向程序运行时的全路径名
argv[1] 指向程序在DOS命令中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串
argv[argc] 为NULL.

二.源代码中的argc与argv
由于C程序必须有main()函数为入口,而且它不能被其他函数调用(可以调用自身),因此不能再程序内部取得实际值.那么在何处把实参赋值给main函数的形参呢?这就需要调用"运行"或"DOS提示符",在调用可执行程序exe时,编译器会帮助我们将输入参数的信息放入main函数的参数列表中传参.
1.计算命令行参数个数程序如下:

 1 <strong>//C 输出参数个数
2 #include <stdio.h>
3 #include <stdlib.h>
4 int main(int argc,char *argv[])
5 {
6 printf("参数个数=%d\n",argc);
7 system("PAUSE");
8 return 0;
9 }
10
11 //C++ 输出参数个数
12 #include <iostream>
13 using namespace std;
14 int main(int argc,char *argv[])
15 {
16 cout<<"参数个数="<<argc<<endl;
17 system("PAUSE");
18 return 0;
19 }</strong>

调用"运行"(快捷键Ctrl+R)或"cmd"输入"G:\test.exe"会输出"参数个数=1",此时存储的就是执行程序名.输入"G:\test.exe 2 hello good"输出"参数个数=4":

2.查看argv[]二维数组存储具体字符串的代码如下:

 1 <strong>//C 查看argv存储参数值及对应序号
2 #include <stdio.h>
3 #include <stdlib.h>
4 int main(int argc,char *argv[])
5 {
6 int i;
7 printf("参数个数=%d\n",argc);
8 for(i=0; i<argc; i++)
9 {
10 printf("参数序号=%d ",i);
11 printf("参数值=%s\n",argv[i]);
12 }
13 system("PAUSE");
14 return 0;
15 }
16
17 //C++ 查看argv存储参数值及对应序号
18 #include <iostream>
19 using namespace std;
20 int main(int argc,char *argv[])
21 {
22 cout<<"参数个数="<<argc<<endl;
23 for(int i=0; i<argc; i++)
24 {
25 cout<<"参数序号="<<i<<" ";
26 cout<<"参数值="<<argv[i]<<endl;
27 }
28 system("PAUSE");
29 return 0;
30 }</strong>

"运行"中输入"G:\test.exe 2 hello good",则输出入下图所示:

其中argv[0]指向字符串可执行程序的名称G盘下的test.exe,通常会位于"项目名称\Debut\xxx.exe"中.后面argv[1..3]单元依次指向程序调用时的参数.

三.调用argc和argv
在"运行"中输入"notepad.exe"回车能执行记事本程序(位于C:\Windows\System32),如果输入"notepad.exe test.txt"可以打开test.txt文本文件,其中test.txt位于当前路径下.如下图所示:

为什么我要讲述这个例子呢?主要是说明参数与exe之间的关系,main()函数其实与之也类似.同时在使用文件知识时,我们通常会涉及到main函数的argc和argv参数.如在《C++ Primer》这本书中第10.3.9实现单词转换的例子就涉及到该运用,这里只讲述涉及到该参数的部分代码供大家参考,大家可以自己去学习了解:

 1 #include <iostream>
2 using namespace std;
3 int main(int argc,char *argv[])
4 {
5 //参数个数=3:工程名\读取txt文件\写入txt文件
6 if(argc!=3)
7 throw runtime_error("wrong number of arguments");
8 //打开转换文件,argv[1]为读取的要转换txt文件名 open_file自定义打开函数
9 if(!open_file(map_file,argv[1]))
10 throw runtime_error("no transformation file");
11 //打开要转换的写入txt文件
12 if(!open_file(input,argv[2]))
13 throw runtime_error("no input file");
14 return 0;
15 }

其中具体操作是通过map(键-值对的集合)对象来实现,推荐大家看看这本最经典的C++书籍.
最后希望该文章对大家有所帮助,请不要小看这简单的基础知识,如果有错误或不足之处,还请海涵.
(By:Eastmount 2014-3-5 夜2点 原创:http://blog.csdn.net/eastmount)

上面这个博客对mian中的参数作用写的很清楚,但是你也许会有疑问mian中有这些参数最终作用是什么呢?

说明这个问题前,先说说电脑中的每一个程序,熟悉linux系统的话,在终端下会常用ls、cat等终端命令,其实它们也是一个个独立的c语言程序,既然是独立的程序那么ls和cat各自都会有一个main函数,它们在运行时也是一个进程;ls命令会列出当前目录下的有哪些文件,cat命令是直接输出文件里面的内容,例如一个text.txt文件,cat text.txt就会将text文件中的内容输出,那问什么cat这个程序后面跟text.txt就会输出其中的内容呢?这就和mian中的参数有关了,下面以c语言的方式写一个cat程序来讲解

#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS int main(int argc, char* argv[])
{
//1、打开文件,文件路径argv[1],只读方式
FILE* fp = NULL;
fopen_s(&fp, argv[1], "r"); //fp为文件描述符
//2、读取文件内容,将内容显示到屏幕
char ch;
while(1)
{
ch = fgetc(fp);
if (feof(fp))//读到空结束
{
break;
}
printf("%c", ch);
}
//3、关闭文件
fclose(fp); return 0;
}

上面就是cat命令的程序,程序项目命名mycat,在vs中编译生成mycat.exe,记住这个mycat.exe放在什么地方,下面会用到,我这里放在了E:\text\text\Debug\mycat.exe

我在F盘下新建了一个cc.txt文件里面输入hellow world

下面就用mycat.exe程序输出cc.txt文件。

windows+R

点击确定进入dos内

输入mycat.exe和cc.txt各自的路径,两个路径中间要用空格分开

按下回车

看这不就将cc.txt内的内容直接输出了吗。

E:\text\text\Debug\mycat.exe就放在了argv[0]中

F:\cc.txt就放在argv[1]中

在上面c语言程序内对argv[1]的操作才实现现在的效果

说白了就是一个编译好的程序要对别的文件操作,就需要argv[ ]来记录文件的路径,才能在程序内部和文件关联起来,而argc就是记录可以同时关联几个文件,程序自身也算1个文件;就像argc = 1,argv[0]就是存放存放程序路径,不能在有argv[1],因为argc已经说明只有一个文件而程序本身也是一个文件。

[C/C++基础知识] main函数的参数argc和argv的更多相关文章

  1. C/C++基础:main函数的参数argc和argv

    转载: https://blog.csdn.net/Eastmount/article/details/20413773 一.main()函数参数 通常我们在写主函数时都是void main()或in ...

  2. main函数的参数argc和argv

    版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/20413773 该篇 ...

  3. (转)C++ main函数中参数argc和argv含义及用法

    原博地址:https://blog.csdn.net/dcrmg/article/details/51987413 argc 是 argument count的缩写,表示传入main函数的参数个数: ...

  4. C++ main函数中参数argc和argv含义及用法

    argc 是 argument count的缩写,表示传入main函数的参数个数: argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0 ...

  5. c语言main函数的参数argc,argv说明

    main函数参数argc,argv说明   C/C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(i ...

  6. C语言中main函数的参数argc和argv

    参考资料: http://wiki.opencv.org.cn/index.php/Main%E5%87%BD%E6%95%B0%E5%8F%82%E6%95%B0argc%EF%BC%8Cargv% ...

  7. Atitit dsl对于数组的处理以及main函数的参数赋值

    Atitit dsl对于数组的处理以及main函数的参数赋值 1.1. 词法解析..添加了[] 方括号的解析支持1 1.2. Ast建立.添加了数组参数的支持..使用了递归下降法..getparam ...

  8. C语言中main函数的参数

    转自:http://blog.csdn.net/cnctloveyu/article/details/3905720 我们经常用的main函数都是不带参数的.因此main 后的括号都是空括号.实际上, ...

  9. 关于main函数传参数的问题

    argc是命令行总的参数个数      argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数      命令行后面跟的用户输入的参数,比如:      int   main(int   ...

随机推荐

  1. (第二章第四部分)TensorFlow框架之TFRecords数据的存储与读取

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html (第二章第二部分)Tens ...

  2. JZ-011-二进制中 1 的个数

    二进制中 1 的个数 题目描述 输入一个整数,输出该数32位二进制表示中1的个数.其中负数用补码表示. 题目链接: 二进制中 1 的个数 代码 /** * 标题:二进制中 1 的个数 * 题目描述 * ...

  3. 我完成了10000小时开发3D引擎

    为什么要开始10000小时? 我以前看过一本叫<异类>的书,书的大概意思是:只要学习10000小时,任何人都可以成为一个领域的大师.这里的"学习"是指完全专注地精进学习 ...

  4. ARP协议、路由器详细工作原理

    ARP原理分析 第一次通信时,有对方IP地址但是没有目标MAC地址,该PC就会在网络层启动ARP协议生成一个ARP报文"我叫1.1,我的MAC是AA;谁是1.3,你的MAC是多少?" ...

  5. linux bash shell 的配置文件

    按生效范围划分两类 全局配置:针对所有用户皆有效 /etc/profile /etc/profile.d/*.sh /etc/bashrc 个人配置:只针对特定用户有效 ~/.bash_profile ...

  6. laravel 根据字段不同值做不同查询

    在开发过程中我们经常遇到这种情况: 例如,一个信息表message,字段type 1.操作提醒 2.平台通知,表message_read记录当信息是平台通知时用户浏览状况 那么 当信息是平台通知时是针 ...

  7. ln -s 软链接知识总结

    ln -s 软链接知识总结 1.软连建立:ln  -s  源文件 软链接文件 2.误区:软链接是创建的,就意味着软链接文件不可以在创建之前存在 3.类比:win快捷方式 4.删除:rm就可以,但源文件 ...

  8. 前端(react)上传到阿里云OSS存储 实例

    需求背景 由于现有的后台管理系统,上传的视频越来越大,加上上传视频较慢,后端小哥提出直接从前端上传视频或者其他文件到阿里云OSS存储. 阿里云OSS 阿里云OSS文档介绍,这里不做过多赘述 安装 原本 ...

  9. mysql 聚集索引和非聚集索引

    聚集索引:聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大: 非聚集索引:非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位 ...

  10. 使用Truffle 部署智能合约

    使用Truffle 部署智能合约 之前我们使用Geth,原生的以太坊Golang工具,分析了创世区块的参数内容,在本地创建了私有以太坊区块链,并使用两个账户进行了挖矿和转账操作,对以太坊有了基本了解. ...