17 深入理解 C 语言 main 函数:返回值意义、命令行参数接收、跨环境差异及CMD乱码解决

news2024/11/15 12:30:21

目录

1 main 主函数

2 main 函数的返回值

2.1 返回值的意义

2.2 默认返回值

2.3 返回值类型

3 main 函数的参数

3.1 参数内容

3.2 案例:循环遍历主函数的参数

3.3 不传递参数

3.4 powershell 环境下传参

3.5 cmd 环境下传参

3.6 解决 cmd 输出乱码问题

3.6.1 查看文件编码方式

3.6.2 修改 CMD 字符编码


1 main 主函数

        在 C 语言中,main 主函数是程序的入口函数,即所有的 C 程序一定要包含一个名为 main 的函数,程序总是从这个函数开始执行,如果没有该函数,程序就无法启动

        主函数中可以调用其它函数,但其它函数不能反过来调用主函数,主函数也不能调用自己(因为这会导致无限递归,最终耗尽系统资源并导致程序崩溃)。


2 main 函数的返回值

2.1 返回值的意义

        main 函数返回一个整数给操作系统。按照惯例,返回 0 表示程序成功执行结束,而返回非零值通常表示程序遇到了某种错误或异常情况。这个返回值可以被操作系统或调用该程序的父进程用来判断程序的执行状态。

2.2 默认返回值

        在 C 语言中,如果 main 函数没有显式地返回一个值,编译器会隐式地添加 return 0; 到函数的末尾。这意味着,如果 main 函数没有 return 语句,它仍然会向操作系统报告成功结束。然而,为了代码的清晰性和可维护性,建议总是显式地包含 return 0; 或在发生错误时返回适当的错误码。

2.3 返回值类型

        main 函数的返回类型必须是 int。这是 C 语言标准规定的,确保 main 函数能够返回一个整数给操作系统。


3 main 函数的参数

3.1 参数内容

        主函数的声明中可以带有两个参数,格式如下:

int main(int argc, char *argv[])
{
    // 函数体
}

        形参 argc,全称是 argument count,它是一个整数,表示传递给程序的命令行参数的数量,包括程序的名称本身。因此,argc 的值至少是 1,即使没有在命令行中指定任何额外的参数。

        形参 argv,全称是 argument value,它是一个指向字符串数组的指针,每个字符串都是一个命令行参数的文本。第一个元素 argv[0] 是程序的名称,随后的元素是传递给程序的参数

        这种方式可以通过命令行的方式执行源代码,并接收指定的字符串传给参数 argv

3.2 案例:循环遍历主函数的参数

        下面,我们创建一个名为 demo.c 的源文件,代码如下:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("主函数的参数个数 argc = %d\n", argc); // 输出参数的数量

    for (int i = 0; i < argc; i++)
    {
        printf("主函数的第%d个参数是:%s\n", i + 1, argv[i]); // 输出每个参数的值
    }

    return 0;
}

3.3 不传递参数

        如果没有传递参数,argc 的值为 1,表示只有一个参数,即程序本身的名称

        如果不需要传递参数的话,可以直接点击 VS Code 中的运行按钮来运行上面这个程序,输出结果如下所示:

        提示:在 Windows 系统中,如果在 PowerShell 下运行程序,argv[0] 通常会包含程序的名称以及它的绝对路径

        当在 VS Code 中直接点击运行按钮时,默认的运行环境是 PowerShell。因此,输出的第一个参数内容是程序本身的名称加上绝对路径。 

3.4 powershell 环境下传参

        如果需要传递参数给 mian 函数,我们可以通过命令行的方式执行 demo.exe 可执行文件,在命令行中传递多个参数给程序时,这些参数通常是通过空格隔开

        下图是在 VS Code 中的命令行(默认的 powershell 环境)下运行程序并传递参数的输出结果:

        提示:上面的输出结果中,使用到了 chcp 指令来查看字符编码,系统回应的内容是 65001,这是 UTF-8 的编码。尽管此源文件的编码也是 UTF-8,但输出结果却是乱码。因此,在 PowerShell 中给主函数传递参数时,可能会遇到乱码问题,即使修改了字符编码也可能无法解决这一问题。

3.5 cmd 环境下传参

        由于在 PowerShell 中给主函数传递参数时可能会遇到乱码问题,即使修改了字符编码也可能无法解决这一问题。为了避免这个问题,我们可以在 cmd(命令提示符)中执行程序。

        首先,确保删除之前生成的 demo.exe 文件,然后在 cmd 中通过 gcc 指令重新生成可执行文件 demo.exe,最后通过命令行传递相应的参数。具体步骤如下:

3.6 解决 cmd 输出乱码问题

        在 CMD(命令提示符)中遇到乱码问题,通常是由于编码不一致或字体不支持显示某些字符集导致的。

        CMD 默认使用的是系统区域设置的编码,通常是 GBK(在中文 Windows 系统中)。如果程序或脚本输出的是 UTF-8 编码的文本,就可能会出现乱码。可以更改 CMD 的编码为 UTF-8 来解决问题。

3.6.1 查看文件编码方式

3.6.2 修改 CMD 字符编码

        在 CMD 中,可以使用 chcp 命令来更改活动代码页(即字符编码)。要切换到 UTF-8 编码,可以使用:

chcp 65001

        chcp 65001 中的 65001 是 UTF-8 编码的代码页编号。在 Windows 系统中,chcp 是“Change Code Page” 的缩写,用于更改当前活动代码页,即字符编码。执行 chcp 65001 命令后,命令提示符(cmd.exe)将使用 UTF-8 编码来处理字符。

        除此之外,也可以在 VS Code 中通过 cmd 窗口来运行此程序,由于 VS Code 默认的运行环境是 PowerShell,所以我们需要修改运行环境,具体操作如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch深度学习基础 7 (简单的线性拟合+检验模型在验证集上的效果)

我们之前做的目的都是评估训练的损失&#xff0c;训练的损失Loss告诉我们&#xff0c;我们的模型是否能够完全拟合训练集&#xff0c;也就是说我们的模型是否有足够的能力处理数据中的相关信息。但是我们之前都是评价训练的好坏&#xff0c;并没有引入验证集。接下来我们就需要…

Java基础——自学习使用(多态)

一、多态的定义 父类的引用指向子类的对象。 B继承A&#xff0c;A abnew B();——父类引用指向子类的对象。 二、创建对象了解多态的内部结构 &#xff08;1&#xff09;父类即A类对象的内存结构图 &#xff08;2&#xff09;子类即B类对象的内存结构图 由于B中重写了父类A中…

EazyDraw for Mac 矢量图绘制设计软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

SSRF和CSRF实战复现

文章目录 SSRFWeb-Hacking-Lab-master1、Centos未授权访问2、Ubuntu未授权访问3、Ubuntu传入公钥访问4、ssrf_redis_lab_pickle_redis_lab CSRF:windphp SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 f…

第三课《排序》

前言 排序是将一组数据&#xff0c;按照指定的顺序或要求来进行排列的过程。是数据结构相关课程和内容较为重要和核心的内容之一&#xff0c;常常作为考试题和面试题目来考察学生和面试者&#xff0c;因此熟练掌握经典的排序算法原理和代码实现是非常重要的 本文介绍了几大较为…

AJAX(5)——Promise

Promise Promise对象用于表示一个异步操作的最终完成或失败及其结果值 语法&#xff1a; //创建Promise对象const p new Promise((resolve, reject) > {//执行异步代码setTimeout(() > {// resolve(成功结果)reject(new Error(失败结果))}, 2000)})//获取结果p.then(r…

坚鹏讲人才第13期:个人数字化转型——个人与时代的共赢之选

坚鹏讲人才第13期&#xff1a;个人数字化转型——个人与时代的共赢之选 在这个日新月异的时代&#xff0c;数字化转型已经成为当今时代的必然趋势&#xff0c;它不仅改变了我们的生活方式&#xff0c;也正在改变着各行各业的运营模式。数字化时代&#xff0c;不仅需要数字化企…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册&#xff1a;•一旦使用 signal 函数注册了信号处理函数&#xff0c;该函数就会一直有效&#xff0c;直到程序结束或者显式地取消注册。2. 注册多次的影响&#xff1a;•如果多次注册同一信号的处理函数&#xff0c;最后一次注册的…

快9月了刚结束基础,武忠祥强化vs张宇18讲应该如何选择?

快9月了&#xff0c;最近有一部分同学刚结束基础&#xff0c;在后台提问&#xff1a;强化到底该学武忠祥还是张宇18讲&#xff1f;其实这个问题&#xff0c;如果你是6月份开始强化&#xff0c;很好回答&#xff0c;但是现在已经快9月份了&#xff0c;很多同学都开始做真题了&am…

代码随想录 刷题记录-16 贪心算法(1)贪心理论基础及习题

一、理论基础 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 贪心的套路&#xff08;什么时候用贪心&#xff09; 贪心算法并没有固定的套路。 所以唯一的难点就是如何通过局部最优&#xff0c;推出整体最优。 靠自己手动模拟&#xff0c…

深度学习 回归问题

1. 梯度下降算法 深度学习中, 梯度下降算法是是一种很重要的算法. 梯度下降算法与求极值的方法非常类似, 其核心思想是求解 x ′ x x′, 使得 x ′ x x′ 在取 x ⋆ x^{\star} x⋆ 时, 可以使得 l o s s 函数 loss函数 loss函数 的值最小. 其中, 在求解 x ′ x x′ 的过…

罗德与施瓦茨RS、UPV 音频分析仪 250KHZ 双通道分析仪UPL

罗德与施瓦茨 UPV 音频分析仪的规格包括&#xff1a; 模拟 双通道分析仪&#xff1a;带宽高达 250 kHz 生成正弦波信号&#xff1a;单通道最高 185 kHz&#xff08;需要 B1&#xff09;和双通道最高 80 kHz FFT本底噪声&#xff1a;< -140dB 固有频率响应&#xff08;20 …

链动 2+1 模式小程序 AI 智能名片商城源码培训邀约策略研究

摘要&#xff1a;本文深入剖析链动 21 模式小程序 AI 智能名片商城源码的培训邀约策略&#xff0c;从该源码的价值出发&#xff0c;阐述邀约的重要性&#xff0c;并详细介绍具体的邀约策略&#xff0c;旨在为相关培训活动提供切实可行的指导&#xff0c;提高邀约成功率&#xf…

前端如何快速切换node版本:nvm

安装之前最好卸载计算机已经安装的node&#xff08;通过Windows菜单找到Node.js的卸载程序&#xff0c;运行卸载程序&#xff09;。下载nvm安装包&#xff1a;nvm安装地址。安装nvm&#xff0c;选择nvm安装根路径指定nodejs的安装路径打开命令行&#xff0c;输入nvm -v 可查看版…

Object.create的原型继承

● 首先我们来从这种方法来创建一个和之前一样计算年龄的方法 const PersonProto {cacleAge() {console.log(2038 - birthYear);} };const zhangsan Object.create(PersonProto); console.log(zhangsan);● 发现确实可以实现原型继承的特性 const PersonProto {cacleAge()…

odoo17 group col 属性

odoo17 group col 属性 以前版本&#xff0c;col4,在17中不能用了&#xff0c;或者方法变了 <record id"hetong.addfj_wizard" model"ir.ui.view"><field name"name">合同附件</field><field name"model">het…

免费的大模型插件llm.nvim

llm.nvim&#xff08;https://github.com/StubbornVegeta/llm.nvim&#xff09;是一款基于cloudflare的免费大模型插件&#xff0c;你可以像使用ChatGPT一样和它进行对话 在使用这款插件之前&#xff0c;你需要注册cloudflare&#xff0c;获取你的account和API key。你可以在这…

RCE - - 无字母数字远程命令执行

题目源码 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析 这道题 code 接 get 传…

【Qt】常用控件QProgressBar

常用控件QProgressBar 使用QProgressBar表示一个进度条&#xff01;&#xff01;&#xff01; QProgressBar的核心属性 属性说明 minimum 进度条最⼩值 maximum 进度条最⼤值 value 进度条当前值 alignment ⽂本在进度条中的对⻬⽅式. Qt::AlignLeft : 左对⻬Qt::Alig…

AJAX(4)——XMLHttpRequest

XMLHttpRequest 定义&#xff1a;XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用于操作的情况下&#xff0c;更新页面的局部内容。XMLHttpRequest在AJAX编程中被大量使用 关系…