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