31. C语言 命令行参数

embedded/2025/2/1 6:53:11/

本章目录:

    • 前言:
    • 什么是命令行参数?
    • 一个简单的示例
      • 运行结果
    • 命令行参数的常见使用场景
      • 带空格的参数
    • 高级命令行参数解析
      • 使用 `getopt_long` 的示例
      • 示例运行
    • 注意事项
    • 进一步的实践:实现多功能程序
    • 总结


前言:

在 C 语言中,命令行参数是一种灵活的机制,可以在运行程序时向其传递信息。这不仅为程序的灵活性提供了保障,还能让我们避免将配置直接硬编码到程序中,从而提高了代码的可维护性和可重用性。

本文将带您详细了解命令行参数的定义、用法及其实际应用场景,并结合增强示例,为您提供更加深入的学习体验。


什么是命令行参数?

在 C 中,命令行参数通过 main 函数的参数传递。典型的 main 函数原型如下:

int main(int argc, char *argv[]);

其中:

  • argc (argument count)
    表示传递给程序的参数个数,包括程序本身的名称,因此 argc 的最小值为 1。

  • argv (argument vector)
    是一个字符串数组,其中每个元素表示一个命令行参数。通常:

    • argv[0] 存储程序的名称。
    • argv[1]argv[argc-1] 是传递给程序的参数。

一个简单的示例

以下是一个基础示例,展示如何处理命令行参数:

#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");}return 0;
}

运行结果

在命令行中使用不同的参数运行程序,结果如下:

$ ./program testing
The argument supplied is: testing$ ./program testing1 testing2
Too many arguments supplied.$ ./program
One argument expected.

命令行参数的常见使用场景

  1. 配置文件路径: 例如 ./program /path/to/config
  2. 模式选择: 例如 ./program --debug
  3. 输入/输出文件名: 例如 ./program input.txt output.txt
  4. 运行时选项和标志:-v 表示详细模式。

带空格的参数

如果参数中包含空格,需要用双引号或单引号括起来。例如:

$ ./program "parameter with spaces"

高级命令行参数解析

在复杂的命令行解析中,手动处理参数容易出错。Linux 提供了 getoptgetopt_long 工具来简化命令行参数的解析。

使用 getopt_long 的示例

以下示例展示了如何处理长选项和短选项:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>int main(int argc, char *argv[]) {char *optstr = "p:n:m:c:";struct option opts[] = {{"path", required_argument, NULL, 'p'},{"name", required_argument, NULL, 'n'},{"mtime", required_argument, NULL, 'm'},{"ctime", required_argument, NULL, 'c'},{0, 0, 0, 0}  // 表示结束};int opt;char path[256] = {0};char name[256] = {0};int modified_time = 0, change_time = 0;while ((opt = getopt_long(argc, argv, optstr, opts, NULL)) != -1) {switch (opt) {case 'p':strcpy(path, optarg);break;case 'n':strcpy(name, optarg);break;case 'm':modified_time = atoi(optarg);break;case 'c':change_time = atoi(optarg);break;case '?':fprintf(stderr, "Unknown option or missing argument.\n");return 1;}}printf("Path: %s\n", path);printf("Name: %s\n", name);printf("Modified Time: %d\n", modified_time);printf("Change Time: %d\n", change_time);return 0;
}

示例运行

$ ./program --path /tmp --name example --mtime 10 --ctime 5
Path: /tmp
Name: example
Modified Time: 10
Change Time: 5

注意事项

  1. 参数名称可自定义:
    main 函数的参数名称(如 argcargv)只是约定俗成的,您可以改用其他名字,如:

    int main(int argument_count, char *argument_vector[]);
    
  2. 类型转换:
    命令行参数通常是字符串,若需要将其转换为数值,可使用标准库函数:

    • atoi (简单转换)
    • strtol (更安全且支持错误检测)
  3. 安全性:
    始终验证和处理命令行参数,以防止错误输入或潜在的安全风险。


进一步的实践:实现多功能程序

作为练习,您可以尝试以下任务:

  • 实现一个支持不同功能模式的程序,--encrypt--decrypt
  • 支持默认值和可选参数, 如未提供路径时使用默认路径。

总结

命令行参数是 C 语言程序的重要功能之一,帮助程序变得更加灵活和易用。从基础的参数传递,到使用 getopt_long 解析复杂选项,掌握这一技能将显著提升您的程序开发能力。希望本文提供的内容能让您对这一主题有更深入的理解!



http://www.ppmy.cn/embedded/158562.html

相关文章

【机器学习】深入探索SVM:支持向量机的原理与应用

目录 &#x1f354; SVM引入 1.1什么是SVM? 1.2支持向量机分类 1.3 线性可分、线性和非线性的区分 &#x1f354; 小结 学习目标 知道SVM的概念 &#x1f354; SVM引入 1.1什么是SVM? 看一个故事&#xff0c;故事是这样子的&#xff1a; 在很久以前的情人节&#xf…

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…

超级强大的压缩和解压工具,免费解压

软件介绍 今天要给大家分享一款超厉害的软件 ——ZArchiver&#xff0c;在我心中&#xff0c;它堪称安卓平台目前最为强大的解压软件。 之前&#xff0c;我一直使用 MT 管理器来解压文件。然而&#xff0c;MT 管理器存在一些局限性。比如在处理解压分卷文件时&#xff0c;它有时…

go理论知识——Go Channel 笔记 [特殊字符]

go理论知识——Go Channel 笔记 &#x1f4dd; 1. 基本概念 &#x1f9e0; 1.1 Channel 是什么&#xff1f; Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。Channel 是类型安全的&#xff0c;意味着你只能发送和接收特定类型的数据。 1.2 Channel 的创建 …

CRC校验详解

CRC校验即循环冗余校验(Cyclic Redundancy Check),是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。首先看两个概念,后续会用到。 模2除法:也叫模2运算,就是结果除以2后取余数。模2除法每一位除的结果不影响其它位,即不向上一位借位,所以实际…

IP服务模型

1. IP数据报 IP数据报中除了包含需要传输的数据外&#xff0c;还包括目标终端的IP地址和发送终端的IP地址。 数据报通过网络从一台路由器跳到另一台路由器&#xff0c;一路从IP源地址传递到IP目标地址。每个路由器都包含一个转发表&#xff0c;该表告诉它在匹配到特定目标地址…

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.项集&#xff08;Itemset&#xff09; 2.规则&#xff08;Rule&#xff09; 3.支持度&#xff08;Support&#xff09; 3.1 支持度的定义 3.2 支持度的意义 3.3 支持度的应用 3.4 支持度的示例 3.5 支持度的调整 3.6 支持度与其他指标的关系 4.置信度&#xff0…

前后分离Vue3+Django 之简单的登入

前端Vue3 <template><div><el-form :model"form" label-width"100px"><el-form-item label"用户名"><el-input v-model"form.username" placeholder"请输入用户名"></el-input></e…