int main(int argc,char* argv[])详解

这篇具有很好参考价值的文章主要介绍了int main(int argc,char* argv[])详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

int main(int argc,char* argv[]) 也可以写成 int main(int argc,char** argv)。
argc表示程序运行时发送给main函数的命令行参数的个数(包括可执行程序以及传参)。
argv[]是字符指针数组,它的每个元素都是字符指针,指向命令行中每个参数的第一个字符。

  • argv[0]指向可执行程序。
  • argv[1]指向可执行程序后的第一个字符串。
  • argv[2]指向可执行程序后的第二个字符串 。
  • argv[3]指向可执行程序后的第三个字符串 。
  • argv[argc]为NULL。

比如在Linu系统下使用vim编写以下代码,并保存为sample.c。

#include <stdio.h>

int main(int argc,char** argv)
{
   int i;
  printf("%d\n",argc);
  for(i=0;i<argc;i++)
  {
   printf("%s\n",*argv);
   argv++;
   //printf("%s\n",argv[i]);
   }
}

然后用“gcc sample.c -o sample.out”编译得到sample.out后,输入“./sample.out aa bb cc”执行。

xjh@ubuntu:~/iot/tmp$ gcc sample.c -o sample.out
xjh@ubuntu:~/iot/tmp$ ls
sample.c  sample.out
xjh@ubuntu:~/iot/tmp$ ./sample.out aa bb cc
4      //显示有4个参数,显然把可执行程序也当做参数了
./sample.out           
aa
bb
cc
xjh@ubuntu:~/iot/tmp$ 

从结果argc=4可知,可执行程序也属于参数之一。

既然可执行程序也属于参数之一,为何下面情况显示的参数个数不是5个呢?

比如有一个名为shell.sh的脚本,其内容如下:

#!/bin/bash

echo "shell_0:$0"
echo "shell_1:$1"
echo "shell_2:$2"
echo "shell_3:$3"
echo "shell_4:$4"
echo "arg_number:$#"
#注意,$#表示传给脚本的参数个数

执行该脚本的时候,结果如下:

xjh@ubuntu:~/iot/tmp$ ./shell.sh aa1 bb2 cc3 dd4 
shell_0:./shell.sh  //$0的值
shell_1:aa1         //$1的值
shell_2:bb2         //$2的值
shell_3:cc3         //$3的值
shell_4:dd4         //$4的值
arg_number:4        //$#表示参数的个数。上面说可执行程序也属于参数,那这里的参数个数为何不是5个?
xjh@ubuntu:~/iot/tmp$ 

猜想

(1)$#尽管表示参数的个数,但可能它表示的是实际传参的个数,不包括可执行程序?(待求证)
(2)现在先这样记住
main函数的argc表示参数个数,包括可执行程序;
shell脚本里的参数个数不包括shell脚本程序,$0表示shell脚本程序,$1表示第一个参数。

补充说明
main函数的原型还可以是:int main(int argc, char **argv, char **env)
其中第三个参数是一个字符串数组,表示环境变量。

#include <stdio.h>
 
// env就是我们给main函数额外传递的环境变量字符串数组
int main(int argc, char **argv, char **env)
{
	int i = 0;
	printf("argc = %d.\n", argc);
	
	while (NULL != argv[i])
	{
		printf("argv[%d] = %s\n", i, argv[i]);
		i++;
	}
	
	i = 0;
	while (NULL != env[i])
	{
		printf("env[%d] = %s\n", i, env[i]);
		i++;
	}
	return 0;
}

输出结果文章来源地址https://www.toymoban.com/news/detail-467343.html

xjh@ubuntu:~/iot/tmp$ ./a.out 
argc = 1.
argv[0] = ./a.out
env[0] = XDG_VTNR=7
env[1] = LC_PAPER=zh_SG.UTF-8
env[2] = LC_ADDRESS=zh_SG.UTF-8
env[3] = XDG_SESSION_ID=c2
env[4] = XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xjh
env[5] = SELINUX_INIT=YES
//省略

到了这里,关于int main(int argc,char* argv[])详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • char类型与int类型的转换

        在c语言中,char类型与int类型可以转换,如何转换我在此做一个粗略的总结 首先是char转换为int 结果为:n 110 110 即将ASC码强制转换为int 但当输入的数字大于127(ASC码的最大值)时,-128和127就像转盘一样连在一起,如果上述代码中a=128,则输出   一个意义不明的符号(因

    2024年02月11日
    浏览(41)
  • 浅谈c/c++中main(),int main(),void main(),int main(void)四者之间的区别

    首先我们要了解C/C++中函数的定义,因为main函数也是函数,与其他函数的区别只是主函数是程序的主线而已,程序从它开始也在其中结束。一个函数由函数名、其前的类型标识符、其后小括号里声明的参数类型和参数名(这里的参数叫形参,即形式参数或虚拟参数)以及大括号

    2024年02月08日
    浏览(34)
  • java中char类型转换成int类型的方法

    java中,需要对输入进行一些判断,比如需要输入的是数字,而用户输入了字符,那么就会报错,因此用char或者String类型接收输入的数据就不会报错,但是问题来了:如何让输入的char或者String类型变为数字呢? 以下是一些方法: 第一种利用Integer 包装类 的方法 Integer.parseIn

    2024年02月13日
    浏览(40)
  • C语言中的char类型和int类型的相互转换

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植等特点。C语言中有多种数据类型,用来表示不同的数据和信息。本文将介绍C语言中的两种基本数据类型:char类型和int类型,以及它们之间的相互转换的方法和原理。 char类型是一种字符类型,用来表示单个字符,

    2024年02月03日
    浏览(40)
  • 271_C++_分别把int类型的参数赋值给unsigned char和char类型的变量,有没有存在异常情况【有详细例子】

    在C++中,将 int 类型的参数赋值给 unsigned char 和 char 类型的变量是允许的,但需要注意一些潜在的异常情况,特别是与数值范围和符号有关的情况。 unsigned char : unsigned char 是一个无符号字符类型,它的取值范围通常是0到255。将一个 int 值赋给 unsigned char 时,如果 int 的值在

    2024年02月09日
    浏览(36)
  • vue3中运用组件写成获取验证码,并实现手机可以接收到验证码事例

    目录 1. 准备工作 2. 编写 Vue3 组件 3. 结论 当我们在开发 Web 应用时,经常会遇到需要获取手机验证码的情况。本文将介绍如何利用 Vue3 组件来实现获取验证码,并让用户的手机接收到验证码的功能。 首先,我们需要一个第三方短信平台来发送短信验证码。这里我们使用阿里云

    2024年02月14日
    浏览(27)
  • C语言基本语句(变量类型int、 float、 double、 char,函数scanf、printf、putchar()、getchar() )

    1. int, float, double, char ①整型int(对应%d)  int a,b;  scanf(\\\"%d,%d\\\",a,b); printf (\\\"%d\\\",a); printf(\\\"我今天吃了%d个苹果,在黑板上写下整数%d,这很有趣。\\\",a,b); //printf(\\\"……\\\",变量名)中,“……”部分内容比较自由,可随便发挥,但必须包括%d,几个变量名就对应几个%d ②单精度型浮点数

    2024年02月08日
    浏览(40)
  • C++:整数(short ,int,long,long long)表示范围

    C++用short、int、long 、long long来表示整数的整形,同一整形也分为有符号(signed)和无符号(unsigned)两种。数据长度与操作系统和编译器的位数有关,其能够表示的范围也有所不同。接下来本文将用代码的形式展示不同数据类型能表示的数据范围。 注释:climits 头文件包含了

    2023年04月08日
    浏览(33)
  • 表单的总数据为什么可以写成一个空对象,不用具体的写表单中绑定的值,vue3

      from为空对象  在v-model里写form.name,其实就是在form这个空对象里添加了一个键名为name的成员,你不用在script标签的form对象里面特意写name属性。

    2024年01月23日
    浏览(54)
  • Oracle to_char可以转换哪些类型的数据

    在Oracle数据库中,TO_CHAR函数用于将数字、日期和时间类型的数据转换为字符串。它可以转换以下类型的数据: 数字类型:TO_CHAR函数可以将数字类型(如NUMBER, INTEGER, FLOAT, DOUBLE, DECIMAL等)转换为字符串。你可以指定格式模型来控制数字的显示方式,例如保留小数位数、添加千

    2024年03月24日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包