【C语言】main函数的argc、argv传参

一、main函数返回值

1.1 函数为什么需要返回值

  1. 一般而言,参数是函数的输入,返回值是函数的输出(在高级应用中,使用参数放回,放回值说明状态)
  2. 函数需要对外输出数据(函数运行的一些结果值)因此需要返回值
  3. 形式上来说,函数被另一个函数所调用,返回值作为函数式的值返回给调用这个函数的地方

1.2 main函数的正确书写

以下三种方式是正确规范的

int main(void){}
int main(int argc, char *argv[]){}
int main(int argc, char **argv){}

以下书写方式是及其不规范的!

void main(){}//极其不规范!!!

1.3 main函数被谁调用

  • C语言规定main函数是整个程序的入口。其他的函数只有直接或间接被main函数所调用才能被执行,从某种角度来讲main函数代表了当前的整个程序。main函数的开始意味着整个程序开始执行,main函数的结束返回意味着整个程序的结束。可以说,谁执行了这个程序谁就调用了main函数!
  1. 表面来看,linux中在命令行中去./xx执行一个可执行程序
  2. 还可以通过shell脚本来调用执行一个程序
  3. 还可以在程序中去调用执行一个程序(fork exec
  • 我们有多种方法都可以执行一个程序,但是本质上是相同的。linux中一个新程序的执行本质上是一个进程的创建、加载、运行、消亡。linux中执行一个程序其实就是创建一个新进程然后把这个程序丢进这个进程中去执行直到结束。命令行本身就是一个进程,在命令行底下./xx执行一个程序,其实这个新程序是作为命令行进程的一个字进程去执行的。

1.4 mian函数的放回值

  • main函数返回给调用这个函数的父进程。父进程调用子进程来执行一个任务,字进程执行完后通过main函数的返回值返回给父进程一个状态值。这个状态值一般表示子进程是够成功执行。(0表示执行成功,负数表示失败)

  • 可以用shell脚本执行程序并获取、答应程序的返回值,如下所示

int main(void)
{
    return 10;//测试用
}

对应的shell脚本为

#!/bin/sh

gcc main.c -o main.elf
./main.elf
echo $?

clipboard_20200214115058.png

二、argc、argv与main函数的传参

  • main函数不传参是可以的,也就是说父进程调用子程序并且给子程序传参不是必须的。int main(void)这种形式就表示程序员认为不必要给main传参
  • 有时候我们希望程序有一种灵活性,选择在执行程序时通过传参来控制程序中的运行,达到不需要重新编译程序就可以改变程序运行结果的效果

2.1 argc和argv

argcargv这两个C语言预订的参数可以实现给main函数传参:

  1. argcint类型,表示运行程序的时候给main函数传递了几个参数
  2. argv是一个字符串数组,这个数组用来存储argc个字符串,每个字符串就是我们给main函数传的一个参数

2.2 给main传参的本质

程序调用虽然有很多方法,但是本质上都是父进程fork一个子进程,然后字进程和exec函数族绑定起来去执行,我们在exec的时候可以给函数传参。二程序调用时可以被传参(也就是main的传参)是操作系统层面的支持完成的。在给main传参要注意:

  1. main函数传参都是通过字符串传进去的
  2. 程序被调用时传参,各个参数之间是通过空格来间隔的
  3. 在程序内部如果要使用argv,那么一定要先检验argc

2.3 测试代码

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    printf("共传入%d个参数\n", argc);
    for(int i = 0; i < argc; i ++)
    {
        printf("传入的第%d个参数为:%s\n", i + 1, argv[i]);
    }
    if(! strcmp(argv[argc - 1], "thride"))
    {
        printf("Hello World!\n");
    }
    return 0;
}

shell脚本为

#!/bin/sh

gcc main.c -o main.elf
./main.elf first second thride
echo $?

测试结果如下:
clipboard_20200215122328.png

三、10以内简单计算器的实现

#include <stdio.h>
#include <string.h>

static inline int add(int a, int b)
{
    return a + b;
}
static inline int sub(int a, int b)
{
    return a - b;
}

int main(int argc, char *argv[])
{
    if(! strcmp(argv[2], "+"))
    {
        int value = add(*argv[1] - '0', *argv[3] - '0');
        printf("the value of %s %s %s is %d\n", \
        argv[1], argv[2], argv[3], value);
    }
    else if(! strcmp(argv[2], "-"))
    {
        int value = sub(*argv[1] - '0', *argv[3] - '0');
        printf("the value of %s %s %s is %d\n", \
        argv[1], argv[2], argv[3], value);
    }
    else
    {
        printf("ERROR\n");
        return -1;
    }
    return 0;
}

clipboard_20200215124117.png

  • 26
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: b'c\xe8\xaf\xad\xe8\xa8\x80main\xe5\x87\xbd\xe6\x95\xb0argc\xe5\x92\x8cargv' 是一个字节串,需要将其解码为字符串。 解码后表达的意思是:这是一个 C 语言的主函数,其中 argcargv 是参数。 ### 回答2: 在C语言中,main函数是程序的入口点。它的形式参数argcargv用于接收程序启动时传递给它的参数。 argc是一个整型变量,它表示传递给程序的参数个数。通常情况下,如果在命令行中运行程序并且没有提供参数,argc的值为1(表示程序名称本身就是一个参数)。如果提供了一个参数,argc的值为2,以此类推。 argv是一个字符指针数组,它包含传递给程序的参数列表。argv[0]是程序名称本身,而argv[1]、argv[2]等则是传递给程序的其他参数。argv的长度等于argc。需要注意的是,所有的参数都以字符串形式传递给程序,因此需要使用适当的函数将它们转换为其他类型。 下面是一个简单的例子,它演示了如何使用argcargv: #include <stdio.h> int main(int argc, char *argv[]) { int i; printf("argc = %d\n", argc); for (i = 0; i < argc; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0; } 在这个例子中,程序接收到的参数个数和每个参数的值都会被打印出来。如果没有传递参数,那么输出结果应该类似于: $ ./program argc = 1 argv[0] = ./program 如果传递了一些参数,那么输出结果应该类似于: $ ./program arg1 arg2 arg3 argc = 4 argv[0] = ./program argv[1] = arg1 argv[2] = arg2 argv[3] = arg3 因此,通过main函数中的argcargv参数,我们可以接收并处理用户传递给程序的参数,这对于开发命令行工具和参数化测试很有用。 ### 回答3: C语言中的main函数有两个参数,分别是argcargv。这两个参数对于理解和编写C语言程序都非常重要。 首先,argc是一个整数类型的变量,表示程序运行时传给main函数的命令行参数的数量。其中,argv是一个字符串类型的数组,用来存储命令行参数的值。在程序中,可以通过引用argv数组中的元素来使用命令行参数。 例如,命令行输入"./program arg1 arg2",则argc的值为3,argv数组中的第一个元素是程序名称"./program",第二个元素是"arg1",第三个元素是"arg2"。程序中可以通过下标访问argv数组元素来获取命令行参数的值,例如argv[1]表示第一个命令行参数arg1的值。 其次,使用argcargv参数还可以实现命令行程序的交互操作。在程序中,可以根据用户的输入来执行不同的操作或返回不同的结果。可以通过解析argv数组元素的值来确定程序的执行方式。 例如,一个计算器程序可以通过命令行参数接收用户输入的数字和操作符,然后计算结果并输出到屏幕上。另外一个程序可以根据命令行参数打开指定的文件并进行操作等等。 总之,理解和使用main函数argcargv参数对于编写高效、灵活的C语言程序非常重要。可以通过这两个参数实现程序的交互操作和应对不同的处理需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值