C语言命令行参数的使用详解

C语言命令行参数的使用详解

C语言程序可以通过命令行参数向程序传递参数。命令行参数指的是在程序名后的一系列字符串,通俗点说就是我们在终端输入程序名后加上的一些参数。比如./program -a b中的-ab就是命令行参数。

命令行参数的格式

命令行参数的格式通常是这样的:

./<executable> arg1 arg2 ...

每个参数中间以空格隔开。如果参数中需要包含空格等特殊字符,则需要用引号括起来。

获取命令行参数

C语言中获取命令行参数需要使用main()函数。它可以通过以下两种形式来接受命令行参数:

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

int main(int argc, char **argv)

其中,argc表示传递参数的个数,包括程序名。argv则是一个字符串数组,存储了每个参数的值。程序名存储在argv[0]中,后面的参数以此类推。

下面是一个简单的示例:

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i;
    for (i = 0; i < argc; i++) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
    return 0;
}

这个程序会输出每个命令行参数的值。将上面代码保存在test.c中,使用gcc -o test test.c命令编译,然后在终端输入./test hello world 123即可看到输出:

Argument 0: ./test
Argument 1: hello
Argument 2: world
Argument 3: 123

示例

程序功能

下面是一个简单的例子。这个程序可以读取一个文件的内容,并将其中的单词转换为大写。文件名由命令行参数传递。

#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    int c;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s filename\n", argv[0]);
        return 1;
    }

    fp = fopen(argv[1], "r");
    if (fp == NULL) {
        fprintf(stderr, "Cannot open file %s\n", argv[1]);
        return 1;
    }

    while ((c = getc(fp)) != EOF) {
        if (islower(c)) {
            putchar(toupper(c));
        } else {
            putchar(c);
        }
    }

    fclose(fp);
    return 0;
}

在命令行输入./uppercase test.txt即可将test.txt文件中的单词转换为大写。

使用选项参数

下面是一个使用选项参数的示例。程序将会读取一个文件,并统计文件中每个字符出现的次数。可以使用-i选项忽略大小写,使用-v选项输出详细信息。

#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    int c;
    int count[256] = {0};
    int ignore_case = 0;
    int verbose = 0;

    if (argc < 2) {
        fprintf(stderr, "Usage: %s [-i] [-v] filename\n", argv[0]);
        return 1;
    }

    int i;
    for (i = 1; i < argc; i++) {
        if (argv[i][0] == '-') {
            int j;
            for (j = 1; argv[i][j]; j++) {
                if (argv[i][j] == 'i') {
                    ignore_case = 1;
                } else if (argv[i][j] == 'v') {
                    verbose = 1;
                } else {
                    fprintf(stderr, "Unknown option %c\n", argv[i][j]);
                    return 1;
                }
            }
        } else {
            fp = fopen(argv[i], "r");
            if (fp == NULL) {
                fprintf(stderr, "Cannot open file %s\n", argv[i]);
                return 1;
            }
        }
    }

    while ((c = getc(fp)) != EOF) {
        if (ignore_case) {
            c = tolower(c);
        }
        count[c]++;
    }

    if (verbose) {
        int i;
        for (i = 0; i < 256; i++) {
            if (count[i] > 0) {
                printf("%c: %d\n", i, count[i]);
            }
        }
    } else {
        int i;
        for (i = 0; i < 256; i++) {
            if (count[i] > 0) {
                printf("%c %d\n", i, count[i]);
            }
        }
    }

    fclose(fp);
    return 0;
}

在命令行输入./charcount -vi test.txt即可统计test.txt中每个字符出现的次数,并输出详细信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言命令行参数的使用详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 汇编基础程序编写教程示例

    下面是关于“汇编基础程序编写教程示例”的完整攻略。 汇编基础程序编写教程示例 什么是汇编语言? 汇编语言是一种计算机语言,其提供给程序员一种直接在机器上运行程序的方法。通过使用纯文本方式编写的汇编程序,程序员可以方便地对程序进行调试、优化和理解。 汇编语言的基本语法和应用 汇编语言是由一种或多种机器指令组成的程序语言,具有紧凑、高效和占用计算机资源少的优点。…

    C 2023年5月30日
    00
  • C++学习之异常机制详解

    C++学习之异常机制详解 什么是异常机制 C++的异常机制可以帮助我们处理程序运行时可能出现的意外状况,而在这些意外状况中,有些可能无法在程序设计时被完全预见,这个时候异常机制就可以帮助我们在程序出现异常时,优雅地终止程序,同时保证程序的稳定性。 C++异常机制的使用 C++的异常机制通过 try 和 catch 块来实现,其中 try 块用来包含可能会抛出…

    C 2023年5月23日
    00
  • 全解史上最快的JOSN解析库alibaba Fastjson

    快速解析JSON数据是现代程序设计中非常常见的操作之一。阿里巴巴提供的Fastjson是一种高度优化的开源JSON解析库,可实现快速的JSON序列化和反序列化。 Fastjson的使用步骤 下载并导入Fastjson包。 创建JSON对象 JSONObject object = new JSONObject(); object.put(“name”, “Jo…

    C 2023年5月23日
    00
  • python中常用的各种数据库操作模块和连接实例

    连接数据库是Python中非常重要的操作之一。Python中有很多数据库操作模块,比如官方的sqlite3模块,以及第三方的MySQLdb和pymongo等模块。下面就对这些模块及其使用做一个详细的介绍和示例说明。 sqlite3模块 官方sqlite3模块是Python内置的模块,它可以通过Python与SQLite数据库进行交互。它允许我们执行SQL语句…

    C 2023年5月23日
    00
  • C++详解如何通过模板实现元素的反序

    当我们需要对一组数据进行反序操作时,可以通过模板来实现。下面就详细说明如何通过模板实现元素的反序操作: 1. 利用模板实现反序函数 我们可以通过模板函数将需要反序的数组作为参数传递进去,然后在函数中进行元素反转操作,最后返回反序后的数组。下面是一段通过模板实现反序函数的代码示例: template<typename T> void Reverse…

    C 2023年5月23日
    00
  • vscode调用c项目后怎么引用dll?

    在VSCode中调用C语言项目,如果需要使用动态链接库(DLL)的话,一般需要进行以下步骤: 创建动态链接库 先编写动态链接库的代码并生成DLL文件。例如,编写一个示例代码,将其保存为 “hello.c”,编译并生成DLL文件 “hello.dll”。示例代码如下: #include <stdio.h> #include <stdlib.h…

    C 2023年5月23日
    00
  • JSP学习之Java Web中的安全控制实例详解

    JSP学习之Java Web中的安全控制实例详解,是一篇讲解Java Web项目中应用安全控制的文章。在Web项目中,安全控制是非常重要的一环。本文将详细介绍实现Java Web应用中的安全控制的过程。 什么是安全控制 首先,我们需要了解什么是安全控制。在Web应用中,安全控制是指对应用程序进行访问限制以保证应用的安全性。安全控制可以是身份验证、授权、审计等…

    C 2023年5月23日
    00
  • 佳能DR6030C扫描仪经常卡纸该怎么办?

    佳能DR6030C扫描仪经常卡纸的解决方法 如果佳能DR6030C扫描仪经常卡纸,可能会导致扫描效率低下,甚至使扫描仪无法使用。解决这个问题需要我们采用以下方法。 方法一:检查纸张 检查纸张是否符合佳能DR6030C扫描仪的规格要求。佳能DR6030C扫描仪支持最大的纸张尺寸是A3(11.7 x 16.5 inch)。 检查纸张的数量是否适当,过多或过少都会…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部