首页 > 编程语言 >C++中int main(int argc, char* argv[])形参解释

C++中int main(int argc, char* argv[])形参解释

时间:2024-10-14 21:59:10浏览次数:6  
标签:main 形参 int argv char 参数 argc

在 int main(int argc, char* argv[]) 中,argc 和 argv 是主函数 main 的参数,用于处理命令行输入参数。它们允许程序从命令行接收额外的输入值,常用于控制程序的执行行为或传递信息。

参数解释

  1. argc(argument count):表示从命令行传递给程序的参数个数,包括程序本身的名字。它是一个 int 类型的变量,表示参数的数量。

    • argc 的值至少为 1,因为第一个参数始终是程序的名字(或路径),即 argv[0]
  2. argv(argument vector):是一个数组,数组中的每个元素是一个指向 char(字符数组,即 C 风格字符串)的指针。它存储从命令行传递的每个参数的值。

    • argv[0] 通常是程序的名字或其执行路径。
    • argv[1] 及后续的元素是命令行输入的参数(如果有)。
    • argv[argc] 是一个空指针 NULL,表示结束。

示例说明

假设有一个程序 example,命令行执行时传入两个参数:

./example input.txt output.txt

参数内容:

  • argc = 3:总共有 3 个参数。
  • argv 数组内容:
    • argv[0] = "./example":程序本身的名字。
    • argv[1] = "input.txt":第一个命令行参数。
    • argv[2] = "output.txt":第二个命令行参数。

示例代码

#include <iostream>

int main(int argc, char* argv[]) {
    std::cout << "Number of arguments: " << argc << std::endl;

    for (int i = 0; i < argc; ++i) {
        std::cout << "Argument " << i << ": " << argv[i] << std::endl;
    }

    return 0;
}

运行结果:

$ ./example input.txt output.txt
Number of arguments: 3
Argument 0: ./example
Argument 1: input.txt
Argument 2: output.txt

常见使用场景

  • 处理输入文件或输出文件:通过命令行参数指定输入文件或输出文件路径。
  • 选项和标志解析:比如程序的行为可以根据不同的命令行参数发生变化,例如 -v 代表“显示版本信息”,-h 代表“帮助”。

示例:基于命令行参数执行不同的操作

#include <iostream>
#include <cstring>

int main(int argc, char* argv[]) {
    if (argc > 1 && strcmp(argv[1], "-v") == 0) {
        std::cout << "Version 1.0" << std::endl;
    } else if (argc > 1 && strcmp(argv[1], "-h") == 0) {
        std::cout << "Usage: ./program [options]" << std::endl;
        std::cout << "-v: Show version" << std::endl;
        std::cout << "-h: Show help" << std::endl;
    } else {
        std::cout << "No valid option provided" << std::endl;
    }

    return 0;
}

执行示例:

$ ./program -v
Version 1.0

$ ./program -h
Usage: ./program [options]
-v: Show version
-h: Show help

总结

  • argc 表示命令行参数的个数,包括程序名。
  • argv 是一个字符串数组,存储每个命令行参数的值。
  • 这种方式广泛用于处理命令行输入的程序中,以便根据不同的参数执行不同的功能。
  • argc 和 argv 是一种 约定俗成的命名,但并非强制要求。它们是标准 C 和 C++ 程序中常用的命名方式,用于表示命令行参数的个数和参数的具体内容。不过,作为参数名,你可以使用其他有效的标识符,只要遵循相应的语法规则和保持代码可读性即可。

    常见的命名约定:

    • argc:一般理解为 argument count,表示参数个数。
    • argv:一般理解为 argument vector,表示参数值的数组。

    尽管这两个名字是常用的,并且几乎所有的例子、教程都会采用这种命名方式,程序员在编写代码时可以使用不同的名字。例如,你可以将它们重命名为 count 和 arguments,代码依然可以正常运行:

    #include <iostream>
    
    int main(int count, char* arguments[]) {
        std::cout << "Number of arguments: " << count << std::endl;
    
        for (int i = 0; i < count; ++i) {
            std::cout << "Argument " << i << ": " << arguments[i] << std::endl;
        }
    
        return 0;
    }
    

    为什么 argc 和 argv 被广泛使用?

    1. 历史背景argc 和 argv 在 C 语言的早期标准中被广泛使用,并逐渐成为命名约定。在学习和使用 C 语言及其派生的语言(如 C++)时,这种命名方式已经深入人心。

    2. 简洁性和可读性argc 和 argv 简洁明了,表达了参数个数和参数列表的含义,方便开发者快速理解代码的目的。

    3. 一致性:保持一致的命名方式有助于团队合作和代码维护,尤其是在大多数程序员都习惯于这种约定时,使用 argc 和 argv 可以提高代码的可读性。

    总结

    • argc 和 argv 是命令行参数的约定命名方式,但它们的名字是可以更改的,只要符合语法,功能不受影响。
    • 使用 argc 和 argv 是为了简洁性和历史习惯,但在实际应用中,开发者可以根据个人或团队的习惯选择其他名字。
    • 除了常见的 int main(int argc, char* argv[]) 形式外,main 函数在 C 和 C++ 中还可以使用其他几种参数形式。以下是几种不同的参数设置:

      1. 无参数形式

      int main() {
          // 程序代码
          return 0;
      }
      

      这种形式的 main 函数没有参数,适用于不需要命令行输入的程序。

      2. 使用 const char* 类型的参数

      虽然不常见,argv 数组的元素可以用 const char* 类型表示,防止修改字符串内容。这通常用于更安全的字符串处理。

      int main(int argc, const char* argv[]) {
          // 程序代码
          return 0;
      }
      

      3. 使用 std::string

      在 C++ 中,可以使用 std::string 来替代 char* 以简化字符串处理。要使用这种形式,需要包含 <string> 头文件。

      #include <iostream>
      #include <string>
      
      int main(int argc, std::string argv[]) {
          // 程序代码
          return 0;
      }
      

      4. 使用 char** 类型

      argv 也可以声明为 char**,这表示它是一个指向指针的指针,等同于 char* argv[]

      int main(int argc, char** argv) {
          // 程序代码
          return 0;
      }
      

      5. 返回类型可以是 void

      在 C 语言中,main 函数的返回类型可以是 void。这不是标准 C++ 的一部分,但某些编译器允许这样做。

      void main() {
          // 程序代码
      }
      

      不过,推荐使用 int 作为返回类型,确保符合标准,因为它可以提供程序的执行状态,0 通常表示成功,非 0 表示错误。

      6. C++11及之后的参数形式

      C++11 及之后版本可以使用 auto 关键字进行类型推断,但 main 函数的参数类型仍需明确指定。C++ 不允许使用 auto 作为 main 的参数类型。

      小结

      • main 函数可以设置为不同的参数形式,但最常见和推荐的形式是 int main(int argc, char* argv[])
      • 使用 std::string 作为 argv 的类型可以使字符串处理更安全。
      • 不同的参数形式可以根据程序需求进行选择,确保代码的可读性和可维护性。

标签:main,形参,int,argv,char,参数,argc
From: https://www.cnblogs.com/chentiao/p/18466287

相关文章

  • 星海智算:史上最大争议!AI先驱Hinton与Hopfield斩获诺贝尔物理学奖
    AI新闻资讯 近两日,两位机器学习先驱 JohnJ.Hopfield和GeoffreyE.Hinton 获得了2024诺贝尔物理学奖,这一消息引爆了整个AI领域!史上最大争议!AI先驱Hinton与Hopfield斩获诺贝尔物理学奖10月8日,瑞典皇家科学院宣布,2024年度诺贝尔物理学奖授予美国科学家约翰·霍......
  • This comparison appears to be unintentional because the types ‘“up “ | “down
    Thiscomparisonappearstobeunintentionalbecausethetypes'"up"|"down"'and'"up"'havenooverlap.<ArkTSCheck>onToggle(dir:"up"|"down"){constidList=AppStora......
  • springboot~ConstraintValidatorContext验证两个字段内容相同
    场景我在开发修改密码功能,通过原密码和新密码及确认新密码,希望通过ConstraintValidator这个方式来校验新密码和确认新密码,规则是这两个密码需要是相同的。参考文档https://github.com/micronaut-projects/micronaut-core/issues/3243https://stackoverflow.com/questions/377......
  • 【vue+printJs】前端打印, 自定义字体大小, 自定义样式, 封装共享样式
    效果示例思维导图目录1,基本使用1,依赖下载2,页面导入3,修改字体大小(可行但不推荐)2,自定义样式,字体大小1,修改字体大小(推荐)2,自定义样式3,封装共享样式3,去除页面页脚内容4,测试案例demo,直接cv可用5,print-js的其他参数说明1,基本使用1,依......
  • CF1987F Interesting Problem
    前两个月被这题薄纱了,最后特判了几个数据通过,现在来补。先看简单版本,注意到后面的删除不会影响到前面的,而如果前面删除了\(x\)次,那么对于后面的任意一点\(i\),只要是满足\(i-2x\lea_i\lei\)这个条件就可以删除。结合数据范围容易想到设\(f_{l,r,x}\)表示对于\([l,r]\)......
  • JNI(Java Native Interface)和NIO(New Input/Output)是什么?
    1.JNI(JavaNativeInterface)JNI是一种接口,允许Java代码与其他编程语言(例如C或C++)编写的本地代码进行交互。通过JNI,Java程序可以调用本地代码中的函数或库,反过来,本地代码也可以访问Java的对象和方法。JNI通常在以下场景中使用:系统级别操作:有时Java无法直接访问操作系统的......
  • 基于Python的自然语言处理系列(26):Get to the Point Summarization
            在本篇文章中,我们将实现经典的"GettothePoint"模型,该模型最初发表于GettothePoint:SummarizationwithPointer-GeneratorNetworks。这是当时最著名的摘要生成模型之一,至今仍有很多人使用其Pointer-Generator架构作为他们模型的一部分。1.模型简介......
  • SBB Local Interface 详解
    SBBLocalInterface详解SBBLocalInterface的基本原理SBB(ServiceBuildingBlock)实体可以通过目标SBB的本地接口(SBBLocalInterface)以同步的方式调用其他SBB实体。这种调用仅限于同一个JVM(Java虚拟机)内部的SBB对象之间,因为它们必须在同一个JVM内驻留。因此,称之为“SB......
  • 人工智能(Artificial Intelligence,简称AI)
    人工智能(ArtificialIntelligence,简称AI)是一种模拟人类智能的科学与技术,它通过模拟人类的思维和行为,实现智能化的计算机系统。人工智能在现代科技中的应用越来越广泛,涵盖了各个领域。在医疗领域,人工智能可以用于辅助诊断和治疗。通过分析大量的医疗数据和图像,人工智能可以提高......
  • Qt开发技巧(十六):文本框的光标处理,数据库的int在视图中展示问题,工程文件中区分系统及硬
    继续讲一些Qt开发中的技巧操作:1.文本框的光标处理正常情况下我们在文本框中输入,光标会一直伴随着我们的输入指向最后,有点像链表的next指针,但有时候文本框中的内容过长,而我们想要主动设置下将光标移到最前面的时候,可以用下面方法。//下面三种方法都可以//1.样式表方式设......