代码改变世界

C 语言编程 — 指令行参数

2020-04-06 17:56  云物互联  阅读(323)  评论(0编辑  收藏  举报

目录

前文列表

程序编译流程与 GCC 编译器
C 语言编程 — 基本语法
C 语言编程 — 基本数据类型
C 语言编程 — 变量与常量
C 语言编程 — 运算符
C 语言编程 — 逻辑控制语句
C 语言编程 — 函数
C 语言编程 — 高级数据类型 — 指针
C 语言编程 — 高级数据类型 — 数组
C 语言编程 — 高级数据类型 — 字符串
C 语言编程 — 高级数据类型 — 枚举
C 语言编程 — 高级数据类型 — 结构体与位域
C 语言编程 — 高级数据类型 — 共用体
C 语言编程 — 高级数据类型 — void 类型
C 语言编程 — 数据类型的别名
C 语言编程 — 数据类型转换
C 语言编程 — 宏定义与预处理器指令
C 语言编程 — 异常处理
C 语言编程 — 头文件
C 语言编程 — 输入/输出与文件操作
C 语言编程 — 堆栈与内存管理

命令行参数

C 语言支持在执行程序时,从命令行传入参数值给程序,这些值被称为命令行参数。当希望从外部控制程序,而不是在代码内对这些值进行硬编码时,非常常见的一种手段。命令行参数是使用 main() 函数参数来处理的:

  • int argc:标识传入的参数的个数。
  • char *argv[]:是一个字符串指针数组,指向传递给程序的每个参数。
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Program name %s\n", argv[0]);

    if (argc == 2) {
        printf("The argument supplied is %s\n", argv[1]);
    }
    else if (argc > 2) {
        printf("Too many arguments supplied.\n");
    }
    else {
        printf("One argument expected.\n");
    }
}

运行:

$ ./main fanguiju
Program name ./main
The argument supplied is fanguiju

其中,argv[0] 存储的是程序的名称,argv[1] 才是指向第一个命令行参数的指针,*argv[n] 则是最后一个参数。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。

多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “” 或单引号 ‘’ 内部。

需要注意的是,也可以使用 char **argv 代替 char *argv[] 形参,以下几个概念竟然让人混淆:

int aArray[5] = {1, 2, 3, 4, 5};  // 数组变量。
char greeting[] = "Hello";        // 字符串变量,本质是一个以 null 字符结尾的字符数组。
char *ch;                         // 字符指针变量,指向字符的指针。
char *stuname_temp[STUDENT_NUM];  // 指针数组变量,每个元素都指向字符(或字符串)的指针的数组。
char **ch;                        // 指针指针变量,指向字符指针的指针。

当 STUDENT_NUM 为 1 或不填写时,char *stuname_temp[STUDENT_NUM]char **ch 的变量名本质是一致的。我们在数组章节提到过,数组变量名就是指向数组第一个元素的指针,如果这个元素的值是一个指针,那么数组变量名的本质就是一个指针指针。

#include <stdio.h>

int main() {
    char **a;
    char *b[] = {0};
    printf("a: %lu\n", sizeof(a));
    printf("b: %lu\n",  sizeof(b));
    return 0;
}

运行:

$ ./main
a: 8
b: 8