[C/C++基础知识] main函数的参数argc和argv

2023-11-06

该篇文章主要是关于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 mainC++ 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.计算命令行参数个数程序如下:

<strong>//C 输出参数个数
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
	printf("参数个数=%d\n",argc);
	system("PAUSE");
	return 0;
}

//C++ 输出参数个数
#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
	cout<<"参数个数="<<argc<<endl;
	system("PAUSE");
	return 0;
}</strong>

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

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

<strong>//C 查看argv存储参数值及对应序号
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
	int i;
	printf("参数个数=%d\n",argc);
	for(i=0; i<argc; i++)
	{
		printf("参数序号=%d ",i);
		printf("参数值=%s\n",argv[i]);
	}
	system("PAUSE");
	return 0;
}

//C++ 查看argv存储参数值及对应序号
#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
	cout<<"参数个数="<<argc<<endl;
	for(int i=0; i<argc; i++)
	{
		cout<<"参数序号="<<i<<" ";
		cout<<"参数值="<<argv[i]<<endl;     
	}
	system("PAUSE");
	return 0;
}</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实现单词转换的例子就涉及到该运用,这里只讲述涉及到该参数的部分代码供大家参考,大家可以自己去学习了解:

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

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

(By:Eastmount 2014-3-5 夜2点 原创:
http://blog.csdn.net/eastmount)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 实体框架一对多关系

    我的 EF 查询大约需要 3 秒才能获取 10 个玩家 因为它获取另一个表的所有 500k 行 而不是我需要的少数行 这是玩家实体 namespace RocketLeagueStats Database Entities Table pl
  • clang-tidy - 忽略第三方标头代码

    我正在为我的项目使用 CMake 并且我想向项目引入 clang tidy 检查 我用于此目的CMAKE CXX CLANG TIDY and clang tidy用于检查设置的文件 我想在 CI 中使用警告作为错误来可靠地检查提交是否引入
  • 将整数四舍五入到最接近的 10 倍数[重复]

    这个问题在这里已经有答案了 我想弄清楚如何对价格进行四舍五入 双向 例如 Round down 43 becomes 40 143 becomes 140 1433 becomes 1430 Round up 43 becomes 50 1
  • CRTP 能否完全取代小型设计的虚拟功能?

    Is CRTP http en wikipedia org wiki Curiously recurring template pattern有足够的能力智胜virtual功能齐全 我认为 CRTP 的唯一缺点是为每个重复模式生成大量代码
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • 如何从 UNC 中提取服务器名称

    谁能告诉我如何从 UNC 中提取服务器名称 ex 服务器名称 目录 目录 编辑 我很抱歉 但看起来我需要澄清一个错误 路径实际上更像是 服务器名 d 目录 我知道这可能会改变一些事情 怎么样Uri Uri uri new Uri serve
  • 通知另一个线程数据可用的最快方法是什么?有什么替代旋转的方法吗?

    我的一个线程将数据写入循环缓冲区 另一个线程需要尽快处理该数据 我本来想写这么简单的spin 伪代码 while true while a i do nothing just keep checking over and over proc
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • FileStream - “不支持给定路径的格式”

    我正在尝试使用EPPlus http epplus codeplex com 在我们的 LAN 上保存电子表格 我正在使用一个FileStream对象执行此操作 但是每当我尝试实例化该对象时 我都会收到错误 The given path s
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • 您在 C# 或 .NET 中见过的最奇怪的极端情况是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 在 C 中初始化结构体的静态数组

    我正在用 C 实现一个纸牌游戏 纸牌有很多种类型 每种纸牌都有大量信息 包括一些需要单独编写与其关联的脚本的操作 给定这样的结构 并且我不确定我的语法是否适合函数指针 struct CARD int value int cost This
  • 如何将焦点设置到 Windows 窗体应用程序中的控件?

    在 Windows 窗体应用程序中 when我是否编写代码以在应用程序启动时以及随后调用函数后将焦点设置到控件 例如 如果我有一个 DropDownList 一个 TextBox 和四个按钮 并且我希望将 Focus 设置为 DropDow
  • 串行端口轮询和数据处理

    我正在尝试通过微控制器从传感器的多个串行端口读取数据 每个串口将接收超过2000个测量值 每个测量值7个字节 全部为十六进制 而且他们同时开火 现在我正在从 4 个串行端口进行轮询 另外 我将每个测量值转换为字符串并将其附加到字符串构建器
  • ASP.NET 5 (vNext) - 配置

    我正在尝试学习 ASP NET 5 我在 Mac OS X 上使用它 此时 我有一个如下所示的 config json 文件 配置 json AppSettings Environment dev DbSettings AppConnect
  • 带有 epgm 的 ZeroMQ PUB/SUB 无法接收同一主机上进程发送的消息

    我的所有进程都有两个套接字 一个 PUB 和一个 SUB 并且它们都使用相同的多播地址和端口 例如 PUB 会这样做 绑定 epgm 239 192 1 1 5555 SUB 将执行以下操作 连接 epgm 239 192 1 1 5555
  • 从原始 URL 获取重定向 URL

    我的数据库中有一个表 其中包含一些网站的 URL 我必须打开这些 URL 并验证这些页面上的一些链接 问题是某些 URL 被重定向到其他 URL 对于这样的 URL 我的逻辑是失败的 有什么方法可以传递原始 URL 字符串并获取重定向的 U
  • 捕获 System.Exception 总是不好的做法吗?

    请考虑下面的代码 它抛出三个不同的异常 即 System Configuration ConfigurationErrorsException System FormatException and System OverflowExcept
  • C# 泛型中的通配符等效项

    假设我有一个通用类 如下所示 public class GeneralPropertyMap

随机推荐

  • SpringQueryMap -SpringCloud feign get method 接受自定义对象参数

    feign中和controller中不一样的地方 controller中可以get方法使用对象参数无需任何注解 可默认绑定到对象 示例代码如下 GetMapping value ClueClient LIST OPERATIONS publ
  • J2EE基础集合框架之Set

    前言 上次与大家介绍了集合框架的LIst集合 List集合的特点的是元素有序且可重复 今天与大家分享的是也是一种集合 叫做Set集合 他和List集合是相反的 今天我们就一起去探究Set集合 首先跟思维导图来了解我今天要分享的内容吧 说明
  • 卷积神经网络&目标检测

    卷积神经网络 目标检测 一 Inception网络 1 Inception网络基本思想 2 采用1 1卷积降低计算量 3 Inception模块和Inception网络 二 迁移学习 三 数据扩充方法 四 目标检测 1 特征点检测 2 通过
  • postman的json脚本转jmeter的jmx脚本

    一般研发同学会用postman做接口自测 但是我们做性能测试的时候 又不能用postman 对鉴权不了解的接口 自己调试脚本又很麻烦 这个时候 我们就可以用这个方法把json脚本转换成jmeter用的jmx脚本 环境准备 这几个工具需要提前
  • join python

    Python join 方法用于将序列中的元素以指定的字符连接生成一个新的字符串 1 join是针对字符串进行操作的 2 join里面的参数只能是一个 可以是字典 列表 元组 然后以前面的分隔 形成一个新的字符串 但是里面的东西必须是字符串
  • 百度智能云x蓝色光标共绘AI营销新篇章

    9月12日 百度集团副总裁袁佛玉参加蓝色光标Blue AI行业模型发布会 参与启动仪式并带来了主题演讲 大模型重塑数智世界 此次蓝色光标推出的行业模型 得益于百度智能云千帆大模型平台 以下简称千帆平台 的强大支持 标志着双方合作的深度与广度
  • element中Notification组件(this.$notify)自定义样式

    1 自定义样式效果 2 vue代码 this notifications this notify title dangerouslyUseHTMLString true duration obj remindMethod 3 0 4500
  • 风火编程-- 装饰器,reduce, 片函数,闭包概念

    python核心编程 读书笔记 六 第十一章 11 3 6装饰器 在不改变函数体的前提下 对函数添加前置或后置功能 def 装饰器函数 func def wrapper args kwargs before func func after
  • LeetCode刷题入门

    Letcode刷题入门篇 开始准备刷Letcode的题目 入门基础题 从简单的题目开始做 先考虑用python解题 一 两数之和 使用最简单的暴力解法 复杂度为O n 2 时间复杂度更低的解法 借用List 的相关函数求解 或使用hash求
  • java实现----猜数:随机生成一个数,判断大小,对错。

    需要用到Random 随机生成一个数 if语句 while语句 import java util Scanner 导包 import java util Random 随机生成一个数 public class 猜数 public stati
  • 3.2 创建Maven聚合工程

    3 2 1 构建父工程fmmall 创建一个maven工程 packing设置为 pom 父工程继承继承spring boot starter parent
  • 博世BMI160六轴传感器I2C通信配置

    博世BMI160简介 Bosch Sensortec公司推出的最新BMI160惯性测量单元将最顶尖的16位3轴重力加速度计和超低功耗3轴陀螺仪集成于单一封装 采用14管脚LGA封装 尺寸为2 5 3 0 0 8mm3 当加速度计和陀螺仪在全
  • 发布的qt程序出现libQt5Core.so.5 版本问题

    原因 发布版本跟别的机器qt环境不一样导致 解决方法 把 1 在客户机 去掉 bashrc 关于qt的环境变量 2 同样的方式去掉 etc profile的环境变量 或者吧qt的环境变量修改正确 因为你发布的软件首先回去系统路径中链接相关库
  • 28 openEuler管理网络-配置主机名

    文章目录 28 openEuler管理网络 配置主机名 28 1 简介 28 2 使用hostnamectl配置主机名 28 2 1 查看所有主机名 28 2 2 设定所有主机名 28 2 3 设定特定主机名 28 2 4 清除特定主机名
  • 【得物技术】自动化生成代码几种方案的演变

    今天我们聊一聊自动化生成代码的问题 试想一下 假如有一天机器替代你编写代码 你是应该感到开心还是难过 方案 目前代码生成技术主要有以下几类 1 基于模版编排生成代码 首先说下基于模版生成代码的方式 这种属于最原始最简单也是目前应用最广泛的一
  • egg.js和nest.js的对比

    egg js和nest js的对比 前几天突然看到一个群在说现在用egg的人已经很少了 说用nest的人比较多 然后我就做了一个简单的调查和对比 egg和nest都是比较优秀的框架 但是两个框架有比较大的区别 我主要分为六个方面来分析egg
  • web socket

    package com web import java io IOException import java util concurrent CopyOnWriteArraySet import javax websocket import
  • Mysql增加传输数据量或连接时间,防止mysql server has gone away报错

    首先登录进mysql mysql u root p 这个需要修改数据库配置的权限 修改数据传输量 默认是1M的数据量 数据量过大时会不够用 因此增加阈值 如下代码为100M show variables like max allowed p
  • 相机与激光雷达联合标定(二)

    前言 LiDAR Camera Calibration LCC 系列 主要介绍激光雷达相机外参标定相关内容 本文主要介绍相关的开源代码和软件 主要包括target based和targetless两类方法 每个方法对应标题后说明了方法的提出
  • [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C C语言最基础的main函数的参数知识 是学习C 或C语言都必备的知识点 不知道你是否知道该知识 希望对大家有所帮助 一 main 函数参数通常我们在写主函数时都是void main 或int main return 0