操作系统(1)命令解释器模拟实现

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");
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值