110.【C语言】编写命令行程序(1)

发布于:2024-12-18 ⋅ 阅读:(53) ⋅ 点赞:(0)

目录

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指针数组存储参数的指针

因此带参数的main函数还有第二种写法

int main(int argc, char** argv)
{
	//......
	return 0;
}

实验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;
}

原因见下篇文章