首页 > 其他分享 >main函数传参

main函数传参

时间:2023-06-19 18:00:33浏览次数:31  
标签:传参 argc 函数 int argv exe 参数 main

在有些C语言程序中,我们会看到main函数有如下的写法:

int main(int argc, char* argv[]);

或者是这样的:

int main(int argc, char** argv);

给main传参通过argc和argv这两个参数来实现。执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。

命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[ ] 是一个字符指针数组,指向传递给程序的每个参数。

下面是一个通过指定命令行参数实现简单计算器的程序

#include <string.h>
#include <stdio.h>
#include <stdlib.h> int Add(int, int); int Sub(int, int); int Mul(int, int); int Div(int, int); int main(int argc, char* argv[]) { if(argc != 4) { printf("Parameters should be 4.\n"); return -1; } int param1 = atoi(argv[1]); int param3 = atoi(argv[3]); if(!strcmp(argv[2], "+")) { printf("%s %s %s = %d\n", argv[1], argv[2], argv[3], Add(param1, param3)); } else if(!strcmp(argv[2], "-")) { printf("%s %s %s = %d\n", argv[1], argv[2], argv[3], Sub(param1, param3)); } else if(!strcmp(argv[2], "x")) { printf("%s %s %s = %d\n", argv[1], argv[2], argv[3], Mul(param1, param3)); } else if(!strcmp(argv[2], "/")) { printf("%s %s %s = %d\n", argv[1], argv[2], argv[3], Div(param1, param3)); } else { printf("Parameters fault.");
     return -1; } return 0; } int Add(int a, int b) { return a + b; } int Sub(int a, int b) { return a - b; } int Mul(int a, int b) { return a * b; } int Div(int a, int b) { return a / b; }

其中C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。由于命令行参数都是字符指针类型,想要对参数进行数学运算,必须把字符串转成int类型。

编译执行如下:

gcc .\calculator.c -o calculator.exe
.\calculator.exe 4*2
4*2=8
.\calculator.exe 4+2
4+2=6
.\calculator.exe 4/2
4/2=2
.\calculator.exe 4-2
4-2=2

 可以看到,通过给定不同的命令行参数,在同一个程序中可以实现不同的功能。

一.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.计算命令行参数个数程序如下:

<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",输出如下

参数个数=4

参数序号=0,参数值=\G:\test.exe

参数序号=1,参数值=2

参数序号=2,参数值=hello

参数序号=3,参数值= good

请按任意键继续


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

 

标签:传参,argc,函数,int,argv,exe,参数,main
From: https://www.cnblogs.com/lanlancky/p/17491812.html

相关文章

  • Oracle列转行函数LISTAGG() WITHIN GROUP ()用法
    1:SELECTID,SIDFROMTestWHERE ID='001' 2:SELECTID,LISTAGG(SID,',')WITHINGROUP(ORDERBYSID)ASSID_LISTFROMTestWHERE ID='001'groupbyID  ......
  • 子函数、子过程的可选参数
    参数的使用参数的使用对于过程和函数都是一样的。所以本节的内容对过程和函数都适用。参数可分为可选参数和必选参数两种。必选参数在调用(过程或函数时)必须加上,否则会报错。可选参数则可写可不写。默认是必选参数,可选参数在定义时用Optional关键字声明,并且可选参数必须放在参数......
  • ABAP READ_TEXT, SAVE_TEXT函数使用,物料,利润中心等长文本批量读取及维护
    一.READ_TEXT函数读取长文本本文以利润中心长文本读取及维护为例子,事务码:KE521.查看长文本参数,输入KE52事务码查看图片12.点击书写按钮后,输入需要维护的长文本语言。查看图片23.点击转到->表头,其中文本名,语言,ID和文本对象为调用函数需要的参数查看图片34.READ_T......
  • 基于ChatGPT函数调用来实现C#本地函数逻辑链式调用助力大模型落地
    6月13日OpenAI官网突然发布了重磅的ChatGPT更新,我相信大家都看到了,除了调用降本和增加更长的上下文版本外,开发者们最关心的应该还是新的函数调用能力。通过这项能力模型在需要的时候可以调用函数并生成对应的JSON对象作为输出。这使开发人员能更准确地从模型获取结......
  • 数学 6多元函数积分学
    数二只要求考二重积分的定义、性质、计算和应用。一二重积分的定义和性质1.定义和几何意义积分过程为:在f(x,y)的定义域(是xOy坐标系中的一个平面区域D)中取面积元,则f(x,y)在D上的积分值即为所有的面积元的面积乘以这一点上的函数值的累加和,其积分思路是用无穷多个小圆柱体的体......
  • 谈一谈PHP中关于非法参数名传参问题
    在CTF中有些时候GET、POST等方法传参中参数名可能存在一些非法字符导致传参问题。下面讲述的也算是CTF比赛中常见的一种Trick注意:这种Trick只能在PHP版本小于8时有效,当PHP版本大于等于8并不会出现这种转换错误在PHP官方文档中有解释当变量名中出现点和空格时,PHP的处理方式https://w......
  • shell函数开发
    函数函数的特点类似于alias别名一样,能够简化linux命令的操作,让整个命令更易读,易用函数,就是将你需要执行的shell命令,组合起来组合成一个函数体还得给这个函数体,起一个名字,这个名字就称之为函数名函数名字+函数体直接调用函数名即可使用shell函数实际开发执行函数的基础概念......
  • go语言函数
    Go函数由若干语句组成的语句块、函数名称、参数列表、返回值构成,它是组织代码的最小单元完成一定的功能函数的作用结构化编程对代码的最基本的封装,一般按照功能组织一段代码封装的目的为了复用,减少冗余代码代码更加简洁美观、可读易懂函数的分类内建函数,如make、new、......
  • 函数Function
    函数的定义与调用Function  Tips:函数与子过程的区别是,函数可以返回值。如果一个函数不返回值,它与子过程并无区别,其中调用方式与子过程相同。无参子函数定义与调用//无参子函数的定义:Function[函数名]()As[返回值类型]//语句1//语句2//...//语句n......
  • My SQL--------My SQL函数
    TRIM():去掉空格RTRIM():去掉右面空格LTRIM():去掉左侧空格UPPER():转大写SOUNDEX:将任何文本串转为描述其语音表示的芝麻油数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对字符串进行发音比较......