• [C/C++基础知识] main函数的参数argc和argv


    该篇文章主要是关于C++C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助.
    一.main()函数参数
    通常我们在写主函数时都是void main()或int main() {..return 0;},但ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99中main()函数主要形式为:
    (1).int main(void)
    (2).int main(int argc,char *argv[]) = int main(int argc,char **argv).
    其参数argc和argv用于运行时,把命令行参数传入主程序.其中ARG是指arguments,即参数.具体含义如下:
    (参照Arguments to main和C++ Primer7.2.6节)
    (1).int argc:英文名为arguments count(参数计数)
    count of cmd line args,运行程序传送给main函数的命令行参数总个数,包括可执行程序名,其中当argc=1时表示只有一个程序名称,此时存储在argv[0]中.
    (2).char **argv:英文名为arguments value/vector(参数值)
    pointer to table of cmd line args,字符串数组,用来存放指向字符串参数的指针数组,每个元素指向一个参数,空格分隔参数,其长度为argc.数组下标从0开始,argv[argc]=NULL.
    argv[0] 指向程序运行时的全路径名
    argv[1] 指向程序在DOS命令中执行程序名后的第一个字符串
    argv[2] 指向执行程序名后的第二个字符串
    argv[argc] 为NULL.

    二.源代码中的argc与argv
    由于C程序必须有main()函数为入口,而且它不能被其他函数调用(可以调用自身),因此不能再程序内部取得实际值.那么在何处把实参赋值给main函数的形参呢?这就需要调用"运行"或"DOS提示符",在调用可执行程序exe时,编译器会帮助我们将输入参数的信息放入main函数的参数列表中传参.
    1.计算命令行参数个数程序如下:

     1 <strong>//C 输出参数个数
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 int main(int argc,char *argv[])
     5 {
     6     printf("参数个数=%d
    ",argc);
     7     system("PAUSE");
     8     return 0;
     9 }
    10  
    11 //C++ 输出参数个数
    12 #include <iostream>
    13 using namespace std;
    14 int main(int argc,char *argv[])
    15 {
    16     cout<<"参数个数="<<argc<<endl;
    17     system("PAUSE");
    18     return 0;
    19 }</strong>

    调用"运行"(快捷键Ctrl+R)或"cmd"输入"G: est.exe"会输出"参数个数=1",此时存储的就是执行程序名.输入"G: est.exe 2 hello good"输出"参数个数=4":

    2.查看argv[]二维数组存储具体字符串的代码如下:

     1 <strong>//C 查看argv存储参数值及对应序号
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 int main(int argc,char *argv[])
     5 {
     6     int i;
     7     printf("参数个数=%d
    ",argc);
     8     for(i=0; i<argc; i++)
     9     {
    10         printf("参数序号=%d ",i);
    11         printf("参数值=%s
    ",argv[i]);
    12     }
    13     system("PAUSE");
    14     return 0;
    15 }
    16  
    17 //C++ 查看argv存储参数值及对应序号
    18 #include <iostream>
    19 using namespace std;
    20 int main(int argc,char *argv[])
    21 {
    22     cout<<"参数个数="<<argc<<endl;
    23     for(int i=0; i<argc; i++)
    24     {
    25         cout<<"参数序号="<<i<<" ";
    26         cout<<"参数值="<<argv[i]<<endl;     
    27     }
    28     system("PAUSE");
    29     return 0;
    30 }</strong>

    "运行"中输入"G: est.exe 2 hello good",则输出入下图所示:

    其中argv[0]指向字符串可执行程序的名称G盘下的test.exe,通常会位于"项目名称Debutxxx.exe"中.后面argv[1..3]单元依次指向程序调用时的参数.

    三.调用argc和argv
    在"运行"中输入"notepad.exe"回车能执行记事本程序(位于C:WindowsSystem32),如果输入"notepad.exe test.txt"可以打开test.txt文本文件,其中test.txt位于当前路径下.如下图所示:

    为什么我要讲述这个例子呢?主要是说明参数与exe之间的关系,main()函数其实与之也类似.同时在使用文件知识时,我们通常会涉及到main函数的argc和argv参数.如在《C++ Primer》这本书中第10.3.9实现单词转换的例子就涉及到该运用,这里只讲述涉及到该参数的部分代码供大家参考,大家可以自己去学习了解:

     1 #include <iostream>
     2 using namespace std;
     3 int main(int argc,char *argv[])
     4 {
     5     //参数个数=3:工程名读取txt文件写入txt文件
     6     if(argc!=3)
     7         throw runtime_error("wrong number of arguments");
     8     //打开转换文件,argv[1]为读取的要转换txt文件名 open_file自定义打开函数
     9     if(!open_file(map_file,argv[1]))
    10         throw runtime_error("no transformation file");
    11     //打开要转换的写入txt文件
    12     if(!open_file(input,argv[2]))
    13         throw runtime_error("no input file");
    14     return 0;
    15 }

    其中具体操作是通过map(键-值对的集合)对象来实现,推荐大家看看这本最经典的C++书籍.
    最后希望该文章对大家有所帮助,请不要小看这简单的基础知识,如果有错误或不足之处,还请海涵.
    (By:Eastmount 2014-3-5 夜2点 原创:http://blog.csdn.net/eastmount)

    上面这个博客对mian中的参数作用写的很清楚,但是你也许会有疑问mian中有这些参数最终作用是什么呢?

    说明这个问题前,先说说电脑中的每一个程序,熟悉linux系统的话,在终端下会常用ls、cat等终端命令,其实它们也是一个个独立的c语言程序,既然是独立的程序那么ls和cat各自都会有一个main函数,它们在运行时也是一个进程;ls命令会列出当前目录下的有哪些文件,cat命令是直接输出文件里面的内容,例如一个text.txt文件,cat text.txt就会将text文件中的内容输出,那问什么cat这个程序后面跟text.txt就会输出其中的内容呢?这就和mian中的参数有关了,下面以c语言的方式写一个cat程序来讲解

    #include<stdio.h>
    #define _CRT_SECURE_NO_WARNINGS
    
    int main(int argc, char* argv[])
    {
        //1、打开文件,文件路径argv[1],只读方式
        FILE* fp = NULL;
        fopen_s(&fp, argv[1], "r"); //fp为文件描述符
        //2、读取文件内容,将内容显示到屏幕
        char ch;
        while(1)
        {
            ch = fgetc(fp);
            if (feof(fp))//读到空结束
            {
                break;
            }
            printf("%c", ch);
        }
        //3、关闭文件
        fclose(fp);
    
        return 0;
    }

    上面就是cat命令的程序,程序项目命名mycat,在vs中编译生成mycat.exe,记住这个mycat.exe放在什么地方,下面会用到,我这里放在了E: ext extDebugmycat.exe

    我在F盘下新建了一个cc.txt文件里面输入hellow world

    下面就用mycat.exe程序输出cc.txt文件。

    windows+R

     点击确定进入dos内

    输入mycat.exe和cc.txt各自的路径,两个路径中间要用空格分开

     按下回车

    看这不就将cc.txt内的内容直接输出了吗。

     E: ext extDebugmycat.exe就放在了argv[0]中

    F:cc.txt就放在argv[1]中

    在上面c语言程序内对argv[1]的操作才实现现在的效果

    说白了就是一个编译好的程序要对别的文件操作,就需要argv[ ]来记录文件的路径,才能在程序内部和文件关联起来,而argc就是记录可以同时关联几个文件,程序自身也算1个文件;就像argc = 1,argv[0]就是存放存放程序路径,不能在有argv[1],因为argc已经说明只有一个文件而程序本身也是一个文件。

  • 相关阅读:
    Ubuntu中的解压缩文件的方式 分类: Java 2014-07-20 22:33 1264人阅读 评论(0) 收藏
    Ubuntu下安装JDK图文解析 分类: Java 2014-07-20 21:28 4565人阅读 评论(3) 收藏
    数据结构和算法设计专题之---24点游戏(穷举法和递归法) 分类: Java 2014-07-18 21:26 789人阅读 评论(0) 收藏
    数据结构和算法设计专题之---单链表的逆序 分类: Java 2014-07-18 21:24 562人阅读 评论(1) 收藏
    Android中实现静态的默认安装和卸载应用 分类: Android 2014-07-02 22:43 5952人阅读 评论(19) 收藏
    Git的使用方法 分类: Java 2014-06-18 18:34 520人阅读 评论(0) 收藏
    J2EE学习篇之--JQuery技术详解 分类: JavaWeb 2014-06-18 11:35 1958人阅读 评论(1) 收藏
    MyEclipse6.0中使用aptana插件,添加jquery提示功能 分类: JavaWeb 2014-06-04 15:35 648人阅读 评论(0) 收藏
    Android中如何搭建一个WebServer 分类: Android 2014-06-01 14:44 8708人阅读 评论(3) 收藏
    J2EE学习篇之--Spring技术详解 分类: JavaWeb 2014-05-28 10:15 1109人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/zhj868/p/14261338.html
Copyright © 2020-2023  润新知