如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
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 窗口,找到编译后的可执行程序的位置。