浅析main函数的参数含义及用法 Shepard-Wang

1. 命令行参数

命令行信息不仅对操作系统命令可用,它对所有程序都是可用的。为了可以访问这些命令行参数(C 标准中称为程序参数),必须把 main 函数定义为含有两个参数的函数。写法如下:

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

argc - 参数计数,是命令行参数的数量(包括程序名本身)

argv - 参数向量,是指向命令行参数的指针数组,这些命令行参数以字符串形式存储。

argv[0]指向程序名,而从 argv[1] argv[argc - 1]则指向余下命令行参数。

argv[argc]是附加元素,这个元素始终是一个空指针 NULL 。空指针是一种不指向任何地方的特殊指针。后面我们会讨论空指针问题。

NULL 是一个宏,VS 中我们发现对这个宏的定义:#define NULL ((void*)0)

如果用户输入命令行:

ls -l remind.c

argc 将为 3:

程序名因操作系统而异。如果程序名不可用,那么 argv[0] 将为 NULL

访问命令行参数的方法:

int i;
for(i = 1; i < argc, i++)
    printf("%s\n", argv[i]);

另一种方法是构造一个指向 argv[1] 的指针,然后对指针重复自增来逐个访问数组中的字符串指针。因为 argv[1] 是指针,所以我们要构造一个指向指针的指针:

char** p;
for(p = &argc[1]; p != NULL; p++){
    printf("%s\n", *p);
}

因为 p 是指向指针的指针,所以 *p 就是指向参数字符串的指针

程序:核对行星的名字

设计一个程序检查一系列字符串,从而找出那些字符串是行星的名字。执行程序时,用户把待测试的字符串放置在命令行中:

planet Mercury Aotoman Pluto Thebug  Earth

程序会指出每个字符串是否为行星名。如果是,程序还将显示行星的编号:

Mercury is a planet 1
Aotoman is not a planet
Pluto is a planet 9
Thebug is not a planet
Earth is a planet 3

注意:命令行输入的第一个参数 planet 是 c 程序编译出的可执行程序名。一般一个叫 x.c 的程序编译后的可执行程序就叫做 x 。

我们命名这个 c 程序为 planet.c 所以编译后的可执行文件应该叫做 planet (在 Windows 上后缀应该为 .exe)

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

#define NUM_PLANETS 9

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

	int i, j;
	char* planets[NUM_PLANETS] = {
	"Mercury", "Venus", "Earth",
	"Mars", "Jupiter", "Saturn",
	"Uranus", "Neptune", "Pluto"
	};

	for (i = 1; i < argc; i++) {
		for (j = 0; j < NUM_PLANETS; j++)
			if (strcmp(argv[i], planets[j]) == 0) {
				printf("%s is a planet %d\n", argv[i], j + 1);
				break;
			}
		if (j == NUM_PLANETS)
			printf("%s is not a planet\n", argv[i]);
	}

	return 0;
}

程序会依次访问每个命令行参数,把它与 planets 中的字符串进行比较,直到找到匹配的名字或到了数组末尾才停止。

我们来看一下如何在 Windows 上测试我们写出的程序。打开 cmd 窗口,找到编译后的可执行程序的位置。