C 命令行参数
C - 命令行参数
Section titled “C - 命令行参数”命令行参数 (Command line arguments) 是在终端或命令提示符下执行 C 程序时传递给它的值。它们允许用户或脚本控制程序行为或提供输入,而无需修改源代码。
例如,一个文件复制程序可能将源文件名和目标文件名作为参数:
$ copy_program source.txt destination.txt在这里,copy_program、source.txt 和 destination.txt 都是命令行参数。
通过 main() 访问参数
Section titled “通过 main() 访问参数”要接收命令行参数,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)。
- 标准保证
示例:打印参数
Section titled “示例:打印参数”此程序打印它接收到的所有命令行参数。
#include <stdio.h>
// Use the standard signature for main to receive argumentsint 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]): ./cmdargsNumber of arguments (argc): 4Arguments passed: argv[1]: first_arg argv[2]: Second Argument argv[3]: 123argv[argc] is NULL (as expected).请注意,包含空格的参数需要用引号括起来,以便 shell 将它们视为一个单独的参数。
解析数字参数
Section titled “解析数字参数”命令行参数始终作为字符串 (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;}命令行参数为程序提供了与执行环境交互的标准方式。