C 语言编程教程

C 语言首页

C 语言基础

C 语言概述 C 语言特性 C 语言发展历史 C 语言下载安装和环境配置 C 语言程序结构 C 语言 Hello World C 编译过程 C 注释 C 标记 C 关键字 C 标识符 C 用户输入 C 基本语法 C 数据类型 C 变量 C 整数提升 C 类型转换 C 类型转换 C 布尔值

C 语言中的常量和文字

C 常量 C 字面量 C 转义序列 C 格式说明符

C 语言中的运算符

C 运算符 C 算术运算符 C 关系运算符 C 逻辑运算符 C 位运算符 C 赋值运算符 C 一元运算符 C 递增和递减运算符 C 三元运算符 C sizeof 运算符 C 运算符优先级 C 其他运算符

C 语言中的决策

C 决策 C if 语句 C if...else 语句 C 嵌套 if 语句 C switch 语句 C 嵌套 switch 语句

C 语言中的循环

C 循环 C While 循环 C For 循环 C Do...while 循环 C 嵌套循环 C 无限循环 C Break 语句 C Continue 语句 C goto 语句

C 语言中的函数

C 函数 C Main 函数 C 按值调用函数 C 按引用调用函数 C 嵌套函数 C 可变参数函数 C 用户定义函数 C 回调函数 C return 语句 C 递归

C 语言中的作用域规则

C 作用域规则 C 静态变量 C 全局变量

C 语言中的数组

C 数组 C 数组的属性 C 多维数组 C 将数组传递给函数 C 从函数返回数组 C 可变长度数组

C 语言中的指针

C 指针 C 指针和数组 C 指针的应用 C 指针运算 C 指针数组 C 指向指针的指针 C 将指针传递给函数 C 从函数返回指针 C 函数指针 C 指向数组的指针 C 指向结构体的指针 C 指针链 C 指针 vs 数组 C 字符指针和函数 C NULL 指针 C void 指针 C 悬垂指针 C 解引用指针 C Near、Far 和 Huge 指针 C 指针数组的初始化 C 指针与多维数组

C 语言中的字符串

C 字符串 C 字符串数组 C 特殊字符

C 语言的结构体和联合

C 结构体 C 结构体和函数 C 结构体数组 C 自引用结构 C 查找表 C 点 (.) 运算符 C 枚举(或 enum) C 结构填充和打包 C 嵌套结构 C 匿名结构和联合 C 联合 C Bit 位字段 C Typedef

C 语言中的文件处理

C 输入和输出 C 文件 I/O(文件处理)

C 语言中的预处理器

C 预处理器 C #pragma 编译指示 C 预处理器操作符 C 宏 C 头文件

C 语言中的内存管理

C 内存管理 C 内存地址 C 存储类

C 其他主题

C 错误处理 C 可变参数 C 命令执行 C 数学函数 C static 静态关键字 C 随机数生成 C 命令行参数

C 语言编程资源

C 语言问题与解答答案 C 语言快速指南 C 语言速查表 C 语言实用资源 C 语言讨论


C 语言中的命令行参数

任何 C 程序中都可能有多个函数,但 main() 函数始终是程序执行的入口点。其他函数可能有一个或多个参数和一个返回类型,而 main() 函数通常不带参数。main() 函数的返回值也是"0"。

int main() {
    ...
    ...
    
    return 0;
}

在 main() 函数内部,可能存在 scanf() 语句,用于让用户输入某些值,然后程序会使用这些值。

#include <stdio.h>

int main() {

   int a;
   scanf("%d", &a);
   printf("%d", a);

   return 0;
}

什么是命令行参数?

除了从程序内部调用输入语句之外,还可以在程序执行时将数据从命令行传递到 main() 函数。这些值称为命令行参数。

命令行参数对您的程序非常重要,尤其是当您想从外部控制程序,而不是将这些值硬编码在代码内部时。

假设您要编写一个 C 程序"hello.c",用于向用户打印"hello"消息。我们不想使用 scanf() 从程序内部读取名称,而是希望从命令行传递名称,如下所示:-

C:\users\user>hello Prakash

该字符串将用作 main() 函数的参数,然后应显示"Hello Prakash"消息。

argc 和 argv

为了方便 main() 函数从命令行接受参数,您应该在 main() 函数中定义两个参数:argc 和 argv[]。

argc 表示传递的参数数量,argv[] 是一个指针数组,指向传递给程序的每个参数。

int main(int argc, char *argv[]) {
    ...
    ...
    
    return 0;
}

argc 参数应始终为非负数。argv 参数是一个指向所有参数的字符指针数组,argv[0] 是程序的名称。之后直到"argv [argc - 1]",每个元素都是一个命令行参数。

打开任意文本编辑器,将以下代码保存为"hello.c"−

#include <stdio.h>

int main (int argc, char * argv[]){
   printf("Hello %s", argv[1]);
   return 0;
}

程序应该从 argv[1] 获取名称,并在 printf() 语句中使用它。

不要从任何 IDE(例如 VS Code 或 CodeBlocks)的"运行"菜单运行程序,而是从命令行编译它 -

C:\Users\user>gcc -c hello.c -o hello.o

构建可执行文件 -

C:\Users\user>gcc -o hello.exe hello.o

将名称作为命令行参数传递 -

C:\Users\user>hello Prakash
Hello Prakash

如果在 Linux 上,编译默认生成目标文件"a.out"。我们需要在运行之前添加前缀"./",使其可执行。

$ chmod a+x a.o
$ ./a.o Prakash

示例

下面是一个简单的示例,它检查命令行中是否提供了任何参数,并相应地执行相应操作 -

#include <stdio.h>

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

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

当使用单个参数编译并执行上述代码时,将产生以下输出 -

$./a.out Testing
The argument supplied is testing.

当使用两个参数编译并执行上述代码时,将产生以下输出 -

$./a.out Testing1 Testing2
Too many arguments supplied.

当不使用任何参数编译并执行上述代码时,将产生以下输出 -

$./a.out
One argument expected

需要注意的是,argv[0] 保存的是程序本身的名称,argv[1] 是指向提供的第一个命令行参数的指针,而 *argv[n] 是最后一个参数。如果没有提供任何参数,则 argc 将被设置为"1";如果传递一个参数,则 argc 将被设置为"2"。

从命令行传递数字参数

让我们编写一个 C 程序,读取两个命令行参数,并执行 argv[1] 和 argv[2] 的加法运算。

示例

首先保存以下代码 -

#include <stdio.h>

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

   int c = argv[1] + argv[2];
   printf("addition: %d", c);
   
   return 0;
}

输出

当我们尝试编译时,您会收到错误消息 -

error: invalid operands to binary + (have 'char *' and 'char *')
 int c = argv[1]+argv[2];
         ~~~~~~~~~~~~~~

这是因为"+"运算符不能包含非数字操作数。

atoi() 函数

为了解决这个问题,我们需要使用库函数 atoi(),它将数字的字符串表示形式转换为整数。

示例

以下示例展示了如何在 C 程序中使用 atoi() 函数 -

#include <stdio.h>
#include <stdlib.h>

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

   int c = atoi(argv[1]) + atoi(argv[2]);
   printf("addition: %d", c);
   
   return 0;
}
输出

从"add.c"编译并构建一个可执行文件,并从命令行运行,传递数字参数 -

C:\Users\user>add 10 20
addition: 30

示例

所有命令行参数均以空格分隔传递,但如果参数本身带有空格,则可以使用双引号 (" ") 或单引号 (' ') 来传递这些参数。

在本例中,我们将传递一个用双引号括起来的命令行参数 -

#include <stdio.h>

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

   printf("Program name %s
", argv[0]);

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

当编译并使用空格分隔但在双引号内的单个参数执行上述代码时,它会产生以下输出 -

$./a.out "testing1 testing2"

Program name ./a.out
The argument supplied is testing1 testing2