C++ main():处理命令行选项

先简单介绍一下命令行编译C++程序的方法。

编写如下代码,输出参数的个数和各个参数:

[cpp]
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(int argc,char* argv[])  
  4. {  
  5.     printf("argc:%d\n",argc);  
  6.     for(int i = 0;i < argc; ++i)  
  7.     printf("%s\n",argv[i]);  
  8.     system("pause");  
  9. }  
代码中,argc包括命令行选项的个数,argv包含argc个C风格字符串,代表了由空格分隔的命令选项。(程序中可以使用这个为标志来做相应的处理)例如,对于如下命令行:prog -d -o ofile data0,argc被设置为5,且argv被设置为下列C风格字符串:
[cpp]
  1. argv[0] = "prog";  
  2. argv[0] = "-d";  
  3. argv[0] = "-o";  
  4. argv[0] = "ofile";  
  5. argv[0] = "data0";  
aegv[0]总是被设置为当前正在被调用的命令(程序运行生成的exe文件名,不包括扩展名)。从索引1到argc-1表示被传递给命令的实际选项。

命令行编译程序的具体步骤:

先编译运行上述代码,在将生成的exe文件拷贝至C盘目录下(自己设置)。然后打开命令提示符:

输入cd C:\切换工作目录至C盘目录。

再输入prog hust whu whut,运行结果:


下面看一下如何取出在argv中的命令行选项。在例子中,将支持下列用法:

program_name [-d] [-h] [-v] [-o output_file] [-l limit_value]  file_name [file_name [file_name [...]]]。

加括号的内容是可选的。具体步骤见程序:

[cpp] code
  1. //C/C++处理main()函数命令行  
  2. #include <iostream>  
  3. #include <vector>  
  4. #include <string>  
  5. #include <ctype.h>//调用atoi函数  
  6. using namespace std;  
  7.   
  8. const char* const prog_name = "prog";  
  9. const char* const prog_version = "version 1.0 (2011/8/24)";  
  10.   
  11. //退出函数  
  12. inline void usage(int exit_value = 0){  
  13.     cerr<<prog_name<<"  usage!"<<endl;  
  14.     exit(exit_value);  
  15. }  
  16.   
  17. int main(int argc,char* argv[]){  
  18.     //声明用于记录用户指定选项的变量  
  19.     bool debug_on = false;  
  20.     bool ofile_on = false;  
  21.     bool limit_on = false;  
  22.   
  23.     string ofile_name;//记录出现的输出文件名  
  24.     int limit = -1;//限制值  
  25.     vector <string> file_names;//记录文件名  
  26.   
  27.     cout<<"argc:"<<argc<<endl;  
  28.     for(int i = 1;i < argc; ++i){//读取argv中的每个选项  
  29.         //输出第i+1个参量  
  30.         cout<<"argv["<<i<<"]:"<<argv[i]<<endl;  
  31.   
  32.         char *pchar = argv[i];  
  33.         switch(pchar[0]){//确定选项类型:-h,-d,-v,-l,-o;或者其他  
  34.             case '-':{  
  35.                 cout<<"case \'-\' found"<<endl;  
  36.                 switch(pchar[1]){//确定用户指定的选项:h,d,v,l,o  
  37.                     case 'd'://处理调试:  
  38.                         cout<<"-d found:debugging turned on!"<<endl;  
  39.                         debug_on = true;  
  40.                         break;  
  41.                     case 'v'://处理版本请求  
  42.                         cout<<"-v found:version info displayed!"<<endl;  
  43.                         cout<<prog_name<<":"<<prog_version<<endl;  
  44.                         return 0;  
  45.                     case 'h'://处理帮助  
  46.                         cout<<"-h found:help info!"<<endl;  
  47.                         usage();  
  48.                     case 'o'://处理输出文件  
  49.                         cout<<"-o found:output file!"<<endl;  
  50.                         ofile_on = true;  
  51.                         break;  
  52.                     case 'l'://处理限制量  
  53.                         cout<<"-l found:resorce limit!"<<endl;  
  54.                         limit_on = true;  
  55.                         break;  
  56.                     default://无法识别的选项  
  57.                         cerr<<prog_name<<":error:unrecognition option -:"<<pchar<<endl;  
  58.                         usage(-1);  
  59.                 }  
  60.                 break;  
  61.             }  
  62.             default://不以'-'开头,是文件名  
  63.                 if(ofile_on){//输出文件名  
  64.                     cout<<"file name:"<<pchar<<endl;  
  65.                     ofile_name = pchar;  
  66.                     ofile_on = false;//复位  
  67.                 }  
  68.                 else if(limit_on){//限制值  
  69.                     limit_on = false;  
  70.                     limit = atoi(pchar);  
  71.                     if(limit<0){  
  72.                         cerr<<prog_name<<":error:negative value for limit!"<<endl;  
  73.                         usage(-2);  
  74.                     }  
  75.                 }  
  76.                 else{//文件名  
  77.                     file_names.push_back(pchar);  
  78.                 }  
  79.                 break;  
  80.         }  
  81.     }  
  82.     if(file_names.empty()){  
  83.         cerr<<prog_name<<":error:no file for processing!"<<endl;  
  84.         usage(3);  
  85.     }  
  86.     else{  
  87.         cout<<(file_names.size() == 1 ? "File":"Files")<<  
  88.             " to be processed are the followed:"<<endl;  
  89.         for(int i = 0;i < file_names.size();++i){  
  90.             cout<<file_names[i]<<"\t"<<endl;  
  91.         }  
  92.     }  
  93.     if(limit != -1){  
  94.         cout<<"user-specified limit:"<<limit<<endl;  
  95.     }  
  96.     if(!ofile_name.empty()){  
  97.         cout<<"user-specified ofile:"<<ofile_name<<endl;  
  98.     }  
  99.       

posted on 2012-04-13 14:59 章涛 阅读(617) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜