- 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语言 - 主函数
- 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语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近、远和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点 (.) 运算符
- C语言 - 枚举 (enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入输出
- C语言 - 文件I/O(文件处理)
- C语言预处理器
- C语言 - 预处理器
- 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()函数。这些值称为命令行参数。
命令行参数对您的程序很重要,尤其是在您希望从外部控制程序,而不是在代码内部硬编码这些值时。
假设您想编写一个名为“hello.c”的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\n", argv[1]);
}
else if(argc > 2) {
printf("Too many arguments supplied.\n");
}
else {
printf("One argument expected.\n");
}
}
输出
当以上代码编译并执行带单个参数时,它会产生以下输出:
$./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\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");
}
}
输出
当以上代码编译并执行带单个空格分隔但用双引号括起来的命令行参数时,它会产生以下输出:
$./a.out "testing1 testing2" Program name ./a.out The argument supplied is testing1 testing2