欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

程序员文章站 2022-07-15 09:22:20
...

        在示例程序中经常可以看到argc和argv这两个参数 ,在调试代码过程中遇到main函数为int main( int argc, char* argv[] ) 这种类型时往往会报错,或者是运行起来了但命令窗口一闪而过,没有出来结果。网上关于这方面的资料也有点乱,在看浅墨大大一书发现其中有关于这一方面的讲解甚为详细,抑制不住要与大家分享的冲动,现结合网上内容并予以实验,整理如下: 
        带形参的main函数,如 main( int argc, char* argv[], char **env ) ,是UNIX、Linux以及Mac OS操作系统中C/C++的main函数标准写法,并且是血统最纯正的main函数写法。 
        在如今的Visual Studio编译器中,main()函数带有参数argc和argv或者不带,即无论是否在函数体中使用argc和argv,返回值为void或不为void,都是合法的。 
        即至少有如下三种写法合法: 
1、返回值为整型带参的main函数

  1. int main( int argc, char** argv )
  2. {
  3. //函数体内使用或不使用argc和argv都可
  4. ……
  5. return 0;
  6. }

2、返回值为整型不带参的main函数

  1. int main( int argc, char** argv )
  2. {
  3. //函数体内使用了argc或argv
  4. ……
  5. return 0;
  6. }

3、返回值为void且不带参的main函数

  1. void main()
  2. {
  3. ……
  4. }

一、argc、argv的具体含义 
        argc和argv参数在用命令行编译程序时有用。main( int argc, char* argv[], char **env ) 中 
        第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。 
        第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下: 
        argv[0]指向程序运行的全路径名 
        argv[1]指向在DOS命令行中执行程序名后的第一个字符串 
        argv[2]指向执行程序名后的第二个字符串 
        argv[3]指向执行程序名后的第三个字符串 
        argv[argc]为NULL 
        第三个参数,char**型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

二、调试方法 
方法一: 
        下面给出一个很典型的例子来进行演示说明:

  1. #include <stdio.h>
  2. using namespace std;
  3. int main(int argc, char ** argv)
  4. {
  5. int i;
  6. for (i = 0; i < argc; i++)
  7. printf("Argument %d is %s\n", i, argv[i]);
  8. return 0;
  9. }

        调试后,找到exe文件所在的位置D:\Program Files\OpenCV\opencv\opencv_test\argc argv_test\Debug里,具体位置因人而异。

关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

        参考http://blog.csdn.net/lyj_viviani/article/details/51817755这里的命令行使用方法,在exe文件夹中shift+右击,选择“在此处打开命令窗口”,按TAB键切换文件,选择exe文件,输入 a b c d回车(注意在a b c d前面要加个空格),得到如下结果: 
关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

方法二 
        调试如下代码:

  1. #include <stdio.h>
  2. using namespace std;
  3. int main(int argc, char ** argv)
  4. {
  5. int i;
  6. for (i = 0; i < argc; i++)
  7. printf("Argument %d is %s\n", i, argv[i]);
  8. getchar();//等待读入任意字符而结束,在此用于保持窗口显示,按下回车键即可退出
  9. return 0;
  10. }

        进入项目【项目】—>【属性】—>【调试】—>【命令参数】—>输入a b c d,如果有多个字符串参数,则用空格隔开。比如要读入两张图片,在命令参数里输入”1.jpg” “2.jpg”。

关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

关于int main( int argc, char* argv[] ) 中arg和argv参数的解析及调试

方法三: 
        最简单的方法就是在不变动原始程序的基础上,将与argc或argv有关的代码注释或替换掉。比如将“Mat Image=imread(argv[1]);”替换成“Mat Image=imread(“1.jpg”);”。

        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/dgreh">
                <img src="https://profile.csdnimg.cn/9/6/0/3_dgreh" class="avatar_pic" username="dgreh">
            </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit "><a href="https://blog.csdn.net/dgreh" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;}" target="_blank">一树荼蘼</a></span>
                    <!-- 等级,level -->
                                            <img class="identity-icon" src="https://csdnimg.cn/identity/blog4.png">                                            </div>
                <div class="text"><span>原创文章 12</span><span>获赞 82</span><span>访问量 9万+</span></div>
            </div>
                            <div class="right-message">
                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;}">关注</a>
                                                            <a href="https://im.csdn.net/im/main.html?userName=dgreh" target="_blank" class="btn btn-sm bt-button personal-letter">私信
                    </a>
                                </div>
                        </div>
                    
    </div>