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() 函数中定义两个参数:argcargv[]

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