1. 效果展示
2. 程序流程图
3. 数据结构设计
4. 功能函数设计
序号 | 函数 | 功能说明 |
1 | void register_cmds(vector<CMD>& cmds) | 命令注册函数:扫描cmds.txt文件,将命令读入内存,存入容器cmds |
2 | void input_cmd(vector<CMD>& cmds) | 命令输入函数:打印命令行提示符,并接收用户输入的命令 |
3 | void execute_cmd(vector<CMD>& cmds, char* input_string) | 命令执行函数:执行输入命令 |
4 | bool match_cmd(vector<CMD>& cmds, char* input_string) | 命令匹配函数:匹配cmds中的命令 |
5 | void help_cmds(vector<CMD> cmds) | 命令查看函数:打印所有已注册命令 |
5. 代码实现
含整个项目及配置资源:
操作系统-命令解释器模拟实现-C++文档类资源-CSDN文库
/// OS-CMD
#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
#define MAX_CMD_NAME_LENGTH 50 // 最大命令名长度
#define MAX_CMD_INTRO_LENGTH 100 // 最大命令名长度
/* 命令结构体 */
typedef struct cmd
{
char cmd_name[MAX_CMD_NAME_LENGTH]; //命令名称
char cmd_intro[MAX_CMD_INTRO_LENGTH]; //命令说明
int cmd_type; //命令类型
} CMD;
/* 函数声明 */
void register_cmds(vector<CMD>& cmds); // 注册命令
void input_cmd(vector<CMD>& cmds); // 输入命令
void execute_cmd(vector<CMD>& cmds, char* input_string); // 执行命令
bool match_cmd(vector<CMD>& cmds, char* input_string); // 匹配命令
void help_cmds(vector<CMD> cmds); // 打印命令
int main()
{
printf("Microsoft Windows [版本 10.0.22000.1219]\n");
printf("(c) Microsoft Corporation。保留所有权利。\n");
vector<CMD> cmds;
register_cmds(cmds);
input_cmd(cmds);
return 0;
}
/*
* 函数介绍:命令注册函数
* 函数功能:扫描cmds.txt文件,将命令读入内存,存入容器cmds;注意处理文件指针异常情况
*/
void register_cmds(vector<CMD>& cmds)
{
CMD temp_cmd;
FILE *fp;
if((fp=fopen("cmds.txt", "a+"))==NULL)
{
cout<<"错误:cmds.txt文件不存在!"<<endl;
exit(0);
}
while(!feof(fp)&&fgetc(fp)!=EOF)
{
fseek(fp, -1L, SEEK_CUR);
fscanf(fp, "%s%s%d", &temp_cmd.cmd_name, &temp_cmd.cmd_intro, &temp_cmd.cmd_type);
cmds.push_back(temp_cmd);
}
if(fclose(fp))
{
cout<<"错误:无法关闭cmds.txt文件!"<<endl;
exit(0);
}
}
/*
* 函数介绍:命令输入函数
* 函数功能:打印命令行提示符,并接收用户输入的命令
*/
void input_cmd(vector<CMD>& cmds)
{
char input_string[MAX_CMD_NAME_LENGTH];
cout<<endl<<"C:\\Users\\24472>";
scanf("%s", input_string);
execute_cmd(cmds, input_string);
}
/*
* 函数介绍:命令执行函数
* 函数功能:执行输入命令
*/
void execute_cmd(vector<CMD>& cmds, char* input_string)
{
if(strcmp(input_string, "help")==0)
{
help_cmds(cmds);
input_cmd(cmds);
}
else if(strcmp(input_string, "quit")==0)
{
cout<<"正在退出..."<<endl;
Sleep(1000);
cout<<"安全退出,欢迎下次使用!"<<endl;
exit(0);
}
else if(match_cmd(cmds, input_string))
{
system(input_string);
input_cmd(cmds);
}
else
{
cout<<input_string<<"不是内部或外部命令,也不是可运行的程序或批处理文件。"<<endl;
input_cmd(cmds);
}
}
/*
* 函数介绍:命令匹配函数
* 函数功能:匹配cmds中的命令
*/
bool match_cmd(vector<CMD>& cmds, char* input_string)
{
int len = cmds.size();
for(int i=0; i<len; i++)
{
if(strcmp(input_string, cmds[i].cmd_name)==0)
{
cout<<input_string<<"命令输入正确!"<<endl;
if(cmds[i].cmd_type==1)
{
cout<<"该命令是内部函数。"<<endl;
}
else if(cmds[i].cmd_type==2)
{
cout<<"该命令是外部函数。"<<endl;
}
cout<<"该命令的作用是:"<<cmds[i].cmd_intro<<"。"<<endl<<endl;
return true;
}
}
return false;
}
/*
* 函数介绍:命令查看函数
* 函数功能:打印所有已注册命令
*/
void help_cmds(vector<CMD> cmds)
{
int len = cmds.size();
printf("文件中共存在%d个命令,详细信息如下:\n", len);
printf("|--------------------|--------------------|----------|\n");
printf("|%-20s|%-20s|%-10s|\n", "命令名称", "命令功能", "命令类型");
printf("|--------------------|--------------------|----------|\n");
for(int i=0; i<len; i++)
{
printf("|%-20s|%-20s|", cmds[i].cmd_name, cmds[i].cmd_intro);
if(cmds[i].cmd_type == 1)
printf("%-10s|\n", "内部命令");
else if(cmds[i].cmd_type == 2)
printf("%-10s|\n", "外部命令");
}
printf("|--------------------|--------------------|----------|\n");
}