目录
1.前置知识
"命令"的含义
运行C语言程序
2.介绍
main函数的参数
实验1
执行结果
实验2
执行结果
修改代码
实验3
分析
方法:遍历数组argv[]中的所有参数
执行结果
修改代码
执行结果
1.前置知识
"命令"的含义
WIN+R输入cmd,在cmd窗口下输入calc后回车
会发现打开了计算器程序
这里的"calc"被称为命令,因此命令在本质上可以理解为程序
运行C语言程序
来到可执行程序的目录下,单击展示路径的地方(即地址栏)
输入cmd
会发现cmd会切换到当前目录下执行
输入C程序的名称就可执行程序
2.介绍
和以往写的程序有所不同,main函数里没有参数
int main()
{//......return 0;
}
但编写命令行程序时,main函数是有参数的!
main函数的参数
格式
int main(int argc, char* argv[ ])
{//......return 0;
}
两个参数:int类型的argc,char*类型的argv
argc全称 argument count;argv的全称argument vector
argc存储命令行参数的个数
argv指向存储参数的数组的首元素
实验1
制以下代码到VS上编译成可执行程序,用cmd去运行这个程序(注意:不要用VS的调试器,Ctrl+F7生成解决方案)
打印Hello World!
#include <stdio.h>
int main(int argc, char* argv[ ])
{printf("Hello World!");return 0;
}
执行结果
实验2
#include <stdio.h>
int main(int argc, char* argv[ ])
{printf("%s", argv[0]);return 0;
}
执行结果
会发现argv[0]存储的实际上是程序的名称
可以这么理解:cmd为main函数传递了1个参数Command.exe,使得参数个数1被写入argc,Command.exe被写入argv指向的数组
修改代码
在printf后再加一行printf("%s", argv[1]);编译后,用cmd执行程序,查看执行结果
会发现Command.exe后跟了一个(null),原因是越界访问
只传了一个参数,但要打印两个参数,导致argv[1]没有值,因此打印(null),即空
实验3
设计一个程序,在cmd中输入Commend.exe --version来显示程序的版本,字符串"The Commend.exe's version is 1.0."
分析
cmd向Commend.exe传递了两个参数Commend.exe和--version(相邻的参数用空格分开),需要自行解析--version
方法:遍历数组argv[]中的所有参数
比较字符串是否相等用strcmp函数,切忌使用argv[i]=="......"!!!!!!
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[ ])
{for (size_t i = 0; i < argc; i++){if (strcmp(argv[i], "--version")==0){printf("The Commend.exe's version is 1.0.");}}return 0;
}
执行结果
正确输入参数后会打印结果,否则不显示参数
修改代码
输入"Commend.exe --version"或"Commend.exe -v"都能打印版本
则if语句修改为
if (strcmp(argv[i], "--version")==0 || strcmp(argv[i], "-v") == 0)
执行结果
问题:既然只检查"--version"和"-v"参数(都是第二个参数),直接写成下面代码不就行了吗?能达到同样的效果,为什么需要遍历参数数组?
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[ ])
{if (strcmp(argv[1], "--version")==0 || strcmp(argv[1], "-v") == 0){printf("The Commend.exe's version is 1.0.");}return 0;
}
原因见下篇文章