Skip to content

C 命令行参数

命令行参数 (Command line arguments) 是在终端或命令提示符下执行 C 程序时传递给它的值。它们允许用户或脚本控制程序行为或提供输入,而无需修改源代码。

例如,一个文件复制程序可能将源文件名和目标文件名作为参数:

$ copy_program source.txt destination.txt

在这里,copy_program、source.txt 和 destination.txt 都是命令行参数。

要接收命令行参数,main 函数必须声明带有两个参数:

int main(int argc, char *argv[]) { /* ... */ }

或等效地:

int main(int argc, char **argv) { /* ... */ }

参数说明:

  • int argc (Argument Count): 一个整数,表示传递给程序的参数总数,包括程序本身的名称。
  • *char argv[] (Argument Vector): 一个指向字符的指针数组(字符串数组)。每个元素 argv[i] 都指向一个以 null 结尾的字符串,表示一个参数。
    • argv[0] 总是指向用于调用程序的名称。
    • argv[1] 指向第一个实际参数。
    • argv[2] 指向第二个实际参数,依此类推。
    • 标准保证 argv[argc] 是一个空指针 (NULL)。

此程序打印它接收到的所有命令行参数。

#include <stdio.h>
// Use the standard signature for main to receive arguments
int main(int argc, char *argv[]) {
printf("Program name (argv[0]): %s\n", argv[0]);
printf("Number of arguments (argc): %d\n", argc);
if (argc > 1) {
printf("Arguments passed:\n");
// Loop through the arguments starting from index 1
for (int i = 1; i < argc; i++) {
printf(" argv[%d]: %s\n", i, argv[i]);
}
} else {
printf("No additional arguments were supplied.\n");
}
// Verify argv[argc] is NULL
if (argv[argc] == NULL) {
printf("argv[argc] is NULL (as expected).\n");
}
return 0;
}

编译和运行:

$ gcc command_args.c -o cmdargs
$ ./cmdargs first_arg "Second Argument" 123

预期输出:

Program name (argv[0]): ./cmdargs
Number of arguments (argc): 4
Arguments passed:
argv[1]: first_arg
argv[2]: Second Argument
argv[3]: 123
argv[argc] is NULL (as expected).

请注意,包含空格的参数需要用引号括起来,以便 shell 将它们视为一个单独的参数。

命令行参数始终作为字符串 (char*) 传递。如果您需要将它们用作数字,则必须使用 <stdlib.h> 中的函数进行转换:

  • *int atoi(const char str): 将字符串转换为整数。错误检查有限。 如果字符串不是有效的数字或发生错误,则返回 0。
  • *long atol(const char str): 将字符串转换为长整数。
  • *double atof(const char str): 将字符串转换为双精度浮点数。
  • long strtol(const char *str, char endptr, int base): (推荐)将字符串转换为长整数,并带有鲁棒的错误检查。endptr 可以指向未**转换的第一个字符。base 指定数字基数(例如,10 表示十进制,16 表示十六进制)。
  • **double strtod(const char *str, char endptr): (推荐)将字符串转换为双精度浮点数,并带有鲁棒的错误检查。

使用 strtol 的示例:

#include <stdio.h>
#include <stdlib.h> // For strtol, exit
#include <errno.h> // For errno
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <integer>\n", argv[0]);
return 1;
}
char *endptr; // To check for conversion errors
long number;
errno = 0; // Reset errno before call
number = strtol(argv[1], &endptr, 10); // Base 10 conversion
// Check for conversion errors
if (errno != 0) {
perror("Conversion error");
return 1;
}
if (endptr == argv[1]) {
fprintf(stderr, "Error: No digits were found\n");
return 1;
}
if (*endptr != '\0') {
fprintf(stderr, "Error: Trailing characters found: %s\n", endptr);
return 1;
}
// Conversion successful
printf("You entered the number: %ld\n", number);
printf("Double the number is: %ld\n", number * 2);
return 0;
}

命令行参数为程序提供了与执行环境交互的标准方式。