简介
在本实验中,你将学习如何在 C 编程中解析命令行参数。实验涵盖了命令行参数的基本概念,包括访问参数数量、获取参数值、处理无效参数以及实现一个简单的命令行工具。通过本实验,你将深入了解如何在 C 程序中处理命令行参数。
在本实验中,你将学习如何在 C 编程中解析命令行参数。实验涵盖了命令行参数的基本概念,包括访问参数数量、获取参数值、处理无效参数以及实现一个简单的命令行工具。通过本实验,你将深入了解如何在 C 程序中处理命令行参数。
在本步骤中,你将学习 C 编程中命令行参数的基本概念,以及它们在程序执行时如何传递给程序。
命令行参数是在程序从命令行启动时传递给程序的参数。在 C 语言中,这些参数通过 main()
函数的两个特殊参数接收:argc
和 argv
。
~/project
目录下创建一个名为 arguments_intro.c
的新文件:cd ~/project
touch arguments_intro.c
#include <stdio.h>
int main(int argc, char* argv[]) {
printf("Number of arguments: %d\n", argc);
for (int i = 0; i < argc; i++) {
printf("Argument %d: %s\n", i, argv[i]);
}
return 0;
}
gcc arguments_intro.c -o arguments_intro
./arguments_intro
./arguments_intro Hello
./arguments_intro Hello World
示例输出:
## 当没有提供参数时
Number of arguments: 1
Argument 0: ./arguments_intro
## 带一个参数
Number of arguments: 2
Argument 0: ./arguments_intro
Argument 1: Hello
## 带两个参数
Number of arguments: 3
Argument 0: ./arguments_intro
Argument 1: Hello
Argument 2: World
argc
和 argv
argc
(argument count):表示传递给程序的参数总数,包括程序名称本身。argv
(argument vector):一个包含实际参数的字符串数组。argv[0]
始终是程序的名称。argv[1]
开始。在本步骤中,你将学习如何使用 argc
参数访问和利用传递给 C 程序的参数数量。
了解如何检查参数数量对于创建灵活且健壮的命令行程序至关重要。你将学习如何验证参数数量并提供适当的反馈。
~/project
目录下创建一个名为 argument_count.c
的新文件:cd ~/project
touch argument_count.c
#include <stdio.h>
int main(int argc, char* argv[]) {
// 检查是否提供了正确数量的参数
if (argc < 2) {
printf("Error: At least one argument is required.\n");
printf("Usage: %s <argument1> [argument2] ...\n", argv[0]);
return 1;
}
// 打印参数总数
printf("Total number of arguments: %d\n", argc);
// 检查参数数量是否过多
if (argc > 4) {
printf("Warning: Too many arguments. Only first 3 will be processed.\n");
}
return 0;
}
gcc argument_count.c -o argument_count
## 无参数
./argument_count
## 一个参数
./argument_count Hello
## 多个参数
./argument_count Hello World Lab
## 过多参数
./argument_count Arg1 Arg2 Arg3 Arg4 Arg5
示例输出:
## 无参数
Error: At least one argument is required.
Usage: ./argument_count <argument1> [argument2] ...
## 一个参数
Total number of arguments: 2
## 多个参数
Total number of arguments: 4
## 过多参数
Total number of arguments: 6
Warning: Too many arguments. Only first 3 will be processed.
argc
告诉你参数的总数,包括程序名称。argc
来验证参数数量。在本步骤中,你将学习如何使用 C 程序中的 argv
数组获取并处理单个参数值。
了解如何访问特定参数值对于创建能够有效处理用户输入的交互式命令行工具至关重要。
~/project
目录下创建一个名为 argument_values.c
的新文件:cd ~/project
touch argument_values.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]) {
// 检查是否至少提供了两个参数
if (argc < 3) {
printf("Usage: %s <name> <age>\n", argv[0]);
return 1;
}
// 获取并存储参数值
char* name = argv[1];
int age = atoi(argv[2]);
// 验证年龄
if (age <= 0) {
printf("Error: Age must be a positive number.\n");
return 1;
}
// 处理并显示参数值
printf("Name: %s\n", name);
printf("Age: %d\n", age);
// 演示字符串比较
if (strcmp(name, "LabEx") == 0) {
printf("Welcome, LabEx user!\n");
}
return 0;
}
gcc argument_values.c -o argument_values
## 正确用法
./argument_values LabEx 25
## 错误用法
./argument_values
./argument_values John
./argument_values John -5
示例输出:
## 正确用法
Name: LabEx
Age: 25
Welcome, LabEx user!
## 错误用法(无参数)
Usage: ./argument_values <name> <age>
## 错误用法(缺少年龄)
Usage: ./argument_values <name> <age>
## 错误用法(无效年龄)
Name: John
Error: Age must be a positive number.
argv[1]
、argv[2]
等用于访问特定参数值。atoi()
将字符串参数转换为整数。strcmp()
用于比较字符串。在本步骤中,你将学习如何在 C 程序中实现健壮的参数验证和错误处理,以管理各种类型的无效输入场景。
创建可靠的命令行工具需要对用户提供的参数进行仔细验证,以防止意外行为并提供清晰的错误信息。
~/project
目录下创建一个名为 argument_validation.c
的新文件:cd ~/project
touch argument_validation.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// 检查字符串是否为有效数字的函数
int is_numeric(const char* str) {
while (*str) {
if (!isdigit(*str)) {
return 0;
}
str++;
}
return 1;
}
int main(int argc, char* argv[]) {
// 检查参数数量是否正确
if (argc != 3) {
fprintf(stderr, "Usage: %s <username> <age>\n", argv[0]);
fprintf(stderr, "Error: Exactly 2 arguments required.\n");
return 1;
}
// 验证用户名
char* username = argv[1];
if (strlen(username) < 3 || strlen(username) > 20) {
fprintf(stderr, "Error: Username must be between 3 and 20 characters.\n");
return 1;
}
// 验证年龄
char* age_str = argv[2];
if (!is_numeric(age_str)) {
fprintf(stderr, "Error: Age must be a positive number.\n");
return 1;
}
int age = atoi(age_str);
if (age < 0 || age > 120) {
fprintf(stderr, "Error: Age must be between 0 and 120.\n");
return 1;
}
// 处理有效参数
printf("Username validated: %s\n", username);
printf("Age validated: %d\n", age);
return 0;
}
gcc argument_validation.c -o argument_validation
## 正确用法
./argument_validation JohnDoe 30
## 参数数量不正确
./argument_validation
./argument_validation JohnDoe
## 无效用户名
./argument_validation Jo 30
./argument_validation JohnDoeWithAVeryLongUsername 30
## 无效年龄
./argument_validation JohnDoe abc
./argument_validation JohnDoe -5
./argument_validation JohnDoe 150
示例输出:
## 正确用法
Username validated: JohnDoe
Age validated: 30
## 参数数量不正确
Usage: ./argument_validation <username> <age>
Error: Exactly 2 arguments required.
## 无效用户名
Error: Username must be between 3 and 20 characters.
## 无效年龄格式
Error: Age must be a positive number.
Error: Age must be between 0 and 120.
stderr
输出错误信息在本步骤中,你将创建一个实用的命令行工具,展示你所学的解析和处理命令行参数的技能。
你将实现一个简单的命令行计算器,根据用户提供的参数执行基本的算术运算。
~/project
目录下创建一个名为 calc.c
的新文件:cd ~/project
touch calc.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数声明
double add(double a, double b);
double subtract(double a, double b);
double multiply(double a, double b);
double divide(double a, double b);
int main(int argc, char* argv[]) {
// 检查参数数量是否正确
if (argc != 4) {
fprintf(stderr, "Usage: %s <operation> <num1> <num2>\n", argv[0]);
fprintf(stderr, "Operations: add, sub, mul, div\n");
return 1;
}
// 解析操作
char* operation = argv[1];
// 将参数转换为数字
double num1 = atof(argv[2]);
double num2 = atof(argv[3]);
// 根据操作执行计算
double result = 0;
if (strcmp(operation, "add") == 0) {
result = add(num1, num2);
printf("%.2f + %.2f = %.2f\n", num1, num2, result);
} else if (strcmp(operation, "sub") == 0) {
result = subtract(num1, num2);
printf("%.2f - %.2f = %.2f\n", num1, num2, result);
} else if (strcmp(operation, "mul") == 0) {
result = multiply(num1, num2);
printf("%.2f * %.2f = %.2f\n", num1, num2, result);
} else if (strcmp(operation, "div") == 0) {
// 检查除以零的情况
if (num2 == 0) {
fprintf(stderr, "Error: Division by zero\n");
return 1;
}
result = divide(num1, num2);
printf("%.2f / %.2f = %.2f\n", num1, num2, result);
} else {
fprintf(stderr, "Error: Invalid operation\n");
fprintf(stderr, "Supported operations: add, sub, mul, div\n");
return 1;
}
return 0;
}
// 算术运算函数
double add(double a, double b) {
return a + b;
}
double subtract(double a, double b) {
return a - b;
}
double multiply(double a, double b) {
return a * b;
}
double divide(double a, double b) {
return a / b;
}
gcc calc.c -o calc
## 加法
./calc add 5 3
## 减法
./calc sub 10 4
## 乘法
./calc mul 6 7
## 除法
./calc div 15 3
## 错误情况
./calc div 10 0
./calc pow 5 2
示例输出:
## 加法
5.00 + 3.00 = 8.00
## 减法
10.00 - 4.00 = 6.00
## 乘法
6.00 * 7.00 = 42.00
## 除法
15.00 / 3.00 = 5.00
## 除以零
Error: Division by zero
## 无效操作
Error: Invalid operation
Supported operations: add, sub, mul, div
在本实验中,你将学习如何在 C 编程中解析命令行参数。首先,你将了解命令行参数的基本概念,包括 main()
函数中的 argc
和 argv
参数。接着,你将学习如何访问参数数量并获取其值。此外,你还将探索如何处理无效参数,并实现一个简单的命令行工具。通过本实验,你将掌握在 C 程序中有效使用命令行参数的知识和技能。