C++控制台程序的命令行参数输入-且支持参数opts扩展

C++控制台程序命令参数输⼊-且⽀持参数opts扩展
C++控制台程序的命令⾏参数输⼊
1. C/C++语⾔中的main函数,经常带有参数argc,argv,如下:
int main(int argc, char** argv)
int main(int argc, char* argv[])
  argc(第⼀个形参)必须是整型变量,标识该控制台命令调⽤中接收到的参数个数,注意,包括该命令程序名字itself。
  argv( 第⼆个形参)必须是指向字符串的指针数组,⽤于保存argc个参数的具体数据。注意数组起始索引为0开始,到argc-1结束。即:argv[0]为命令⾏中可执⾏程序名本⾝,argv[1]为命令⾏中第⼆个参数的内容,依次类推。
加上形参说明后,因此C程序中的main函数的函数头应写为:
main (int argc,char *argv[])
2. 控制台程序参数获取
  由于main函数不能被其它函数调⽤,因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main 函数的参数值是从命令⾏上获得的。
  如何在操作系统命令⾏获取参数呢?
(1)在VS中设置时右键项⽬->属性->调试->命令参数,在命令参数中添加所需参数,字符串之间⽤空格分开即可。如果是.txt⽂件,要放
在当前⽬录下(.cpp所在⽬录)【实质为exe⽣成⽬录位置】,不然不到。
(2)或者:假如你的程序是,如果在命令⾏运⾏该程序,(⾸先应该在命令⾏下⽤ cd 命令进⼊到 ⽂件所在⽬录)运⾏命令为:
< //.txt也在.exe所在⽬录下
  注意:调⽤控制台程序命令⾏中输⼊的参数在位置上,并没有与控制台程序main函数中的两个形参⼀⼀对应的。因为,main的形参只有⼆个,⽽命令⾏中的参数个数原则上未加限制。argc参数表⽰了命令⾏中参数的个数(注意:⽂件名本⾝也算⼀个参数),argc的值是在输⼊命令⾏时由系统按实际参数
的个数⾃动赋予的,即,argv[0]为命令⾏中可执⾏程序名本⾝,argv[1]为命令⾏中第⼆个参数的内容,依次类推。
  在调⽤⼀个可执⾏程序时,某些情况下需要向程序传递参数。如我们可以在控制台中键⼊,回车后将执⾏记事本程序。
  如果我们希望在打开notepad时同时打开⼀个⽂本⽂件,可以在 。后⾯跟上⽂件的路径和名字,如
<  (⽂件在当前路径)
  那么程序中如何能得到这些输⼊参数呢?这个⼯作是编译器帮我们完成的,编译器将输⼊参数的信息放⼊main函数的参数列表中。
  main函数的参数列表保存了输⼊参数的信息,第⼀个参数argc记录了输⼊参数的个数,第⼆个参数是字符串数组的,字符串数组的每个单元是char*类型的,指向⼀个c风格字符串。
例⼦如下:
<     
第⼀个参数    第⼆个参数   第三个参数  第四个参数
因此:argc = 4
 控制台执⾏上⾯程序后,程序读取main函数参数为:  argc是4,就是说argv数组中有四个有效单元
家庭智能化控制系统  argv数组中的第⼀个单元指向的字符串总是可执⾏程序的名字,以后的单元指向的字符串依次是程序调⽤时的参数。
第⼀单元argv[0]指向的字符串是""
第⼆单元argv[1]指向的字符串是""
第三单元argv[2]指向的字符串是""
第四单元argv[3]指向的字符串是""
  `上述这个赋值过程是编译器⾃动完成的,我们只需要利⽤argc,argv[]读出数据就可以了。
3. 简单⽰例,控制台程序的不同调⽤⽅法,及输出结果:
int main(int argc, char* argv[])
偏心轮机构{
cout << "参数个数:" << argc << endl;
cout << "参数内容:";
for (int i = 0; i < argc; ++i)
{
cout << argv[i] << endl;
}
//std::cout << "Hello World!\n";
system("pause");
}
(1)控制台调⽤:
1、按住Shift键,⿏标右键快捷⽅式,先打开Powershell窗⼝。
2、输⼊start cmd回车
3、这样就可以打开cmd窗⼝了,并且cmd的⼯作⽬录就是当前的⽬录。
液压卸车翻板输⼊命令⾏:
< 1111 zhongguo renmin 传见过中国⼈民解放拒绝
输出:
yig滤波器
(2)利⽤VSIDE中的控制台参数进⾏调⽤:
程序:
#include <iostream>
int main(int argc, char **argv)
{
while (argc-- > 0)
{
//printf("argv[%d]:%s\n", argc, argv[argc]);
printf("argc:%d,*argv++:%s\n", argc,*argv++);
//printf("argc:%d,*++argv:%s\n", *++argv);
}
}
在VS中设置设置 comant argument:
不进⾏设置时:
设置参数时:
(3)批处理脚本中.bat⽂件中,调⽤可执⾏⽂件
编辑“main测试.bat”⽂件内容为:
ProjectTest  Jack 中国 boin747 1.2343.33338888 zhongguo
pause
在cmd运⾏.bat⽂件
双击:
  好像识别汉字出现了问题,这⾥只是测试,能达到⽰意main函数的传参即可,我就不深因了。如果把汉字改为数字和字母,则运⾏效果如预期:
4. 较为复杂的命令⾏程序,规范化输⼊,编写规范
  下⾯摘录⼀个例程,该程序⽤于取出在argv中的命令⾏选项。在例⼦中,将⽀持下列⽤法:
//C/C++处理main()函数命令⾏
#include <iostream>
#include <vector>
#include <string>
#include <ctype.h>//调⽤atoi函数
using namespace std;
const char* const prog_name = "prog";
const char* const prog_version = "version 1.0 (2011/8/24)";
//退出函数
inline void usage(int exit_value = 0){
cerr<<prog_name<<"  usage!"<<endl;
exit(exit_value);
}
int main(int argc,char* argv[]){
//声明⽤于记录⽤户指定选项的变量
bool debug_on = false;
bool ofile_on = false;
bool limit_on = false;
string ofile_name;//记录出现的输出⽂件名
int limit = -1;//限制值
vector <string> file_names;//记录⽂件名
cout<<"argc:"<<argc<<endl;
for(int i = 1;i < argc; ++i){//读取argv中的每个选项
/
/输出第i+1个参量
cout<<"argv["<<i<<"]:"<<argv[i]<<endl;
char *pchar = argv[i];
switch(pchar[0]){//确定选项类型:-h,-d,-v,-l,-o;或者其他
case'-':{
cout<<"case \'-\' found"<<endl;
switch(pchar[1]){//确定⽤户指定的选项:h,d,v,l,o
case'd'://处理调试:
cout<<"-d found:debugging turned on!"<<endl;
debug_on = true;
break;
case'v'://处理版本请求
cout<<"-v found:version info displayed!"<<endl;
cout<<prog_name<<":"<<prog_version<<endl;
return0;
case'h'://处理帮助
cout<<"-h found:help info!"<<endl;
usage();
case'o'://处理输出⽂件
cout<<"-o found:output file!"<<endl;
ofile_on = true;
break;
case'l'://处理限制量混合辅助肢体
cout<<"-l found:resorce limit!"<<endl;
limit_on = true;
break;
default://⽆法识别的选项
cerr<<prog_name<<":error:unrecognition option -:"<<pchar<<endl;                        usage(-1);
}
break;
}
default://不以'-'开头,是⽂件名
if(ofile_on){//输出⽂件名
cout<<"file name:"<<pchar<<endl;
ofile_name = pchar;
ofile_on = false;//复位
}
else if(limit_on){//限制值
limit_on = false;
limit = atoi(pchar);
碳素纸if(limit<0){
cerr<<prog_name<<":error:negative value for limit!"<<endl;
usage(-2);
}
}
else{//⽂件名
file_names.push_back(pchar);
}
break;
}
}
if(pty()){
cerr<<prog_name<<":error:no file for processing!"<<endl;
usage(3);
}
else{
cout<<(file_names.size() == 1 ? "File":"Files")<<
" to be processed are the followed:"<<endl;
for(int i = 0;i < file_names.size();++i){
cout<<file_names[i]<<"\t"<<endl;
}
}
if(limit != -1){
cout<<"user-specified limit:"<<limit<<endl;
}
if(!pty()){
cout<<"user-specified ofile:"<<ofile_name<<endl;
}
}
参考博客:

本文发布于:2024-09-21 01:27:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/218893.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   程序   函数   命令   字符串   控制台
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议