Cprogramming 简明教程

Command Line Arguments in 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;
}

What are Command Line Arguments?

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

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

假设您想编写一个 C 程序“hello.c”,为用户打印一条“hello”消息。除了使用 scanf() 从程序内部读取名称之外,我们希望从命令行传递名称,如下所示 −

C:\users\user>hello Prakash

字符串将被用作 main() 函数的参数,然后将显示“Hello Prakash”消息。

argc and 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 ”。

Passing Numeric Arguments from the Command Line

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

Example

从保存以下代码开始−

#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];
         ~~~~~~~~~~~~~~

这是因为“+”运算符不能有非数字操作数。

The atoi() Function

要解决此问题,我们需要使用库函数 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