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()函数中定义两个参数——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\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
广告
© . All rights reserved.