实验一 命令解释程序

 

 

 

一、实验目的

(1)掌握命令解释程序的原理;

(2)掌握简单的DOS调用方法;

(3)掌握C语言编程初步。

 

二、实验内容和要求

编写类似于DOS,UNIX的命令行解释程序

(1)自行定义系统提示符

(2)自定义命令集(8-10个)

(3)用户输入HELP以查找命令的帮助

(4)列出命令的功能,区分内部还是外部命令

(5)用户输入QUIT退出

(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。

 

三、实验方法、步骤及结果测试

 

  1. 1.     源程序名:压缩包文件(rarzip)中源程序名0311.c

      可执行程序名:0311.exe

  1. 2.     原理分析及流程图  

      用文件读写的方式将命令及命令作用存入结构体数组

      命令解释程序的原理:

        命令解释程序的主要功能是:

          接受和执行一条用户从键盘输入的命令,它通常保存一张命令名字(动词)表,其中记录着所有操作命令及其处理程序的入口地址或有关信息。

        命令解释程序实现的两种方式 :

          一种是它自身包含了命令的执行代码;

          另一种是由专门的“系统程序” 实现,自身不含命令处理代码,也不进行处理,仅仅把这条命令对应的命令文件装入内存执行。

  1. 3.     主要程序段及其解释:
复制代码
#include <stdio.h>
#include <string.h>

struct
{
    char character[50];//命令字符
    char explain[200];//命令解释
    int category;//命令分类 1-内部命令 0-外部命令
}typedef command;

int count = 0;
command cmd[30];

void Init()//读取文件
{        
    FILE *fp;
    if((fp=fopen("cmd.txt","a+"))!=NULL)
    {
        while(!feof(fp)&&fgetc(fp)!=EOF)
        {
            fseek(fp,-1L,SEEK_CUR);
            fscanf(fp,"%s%s%d",&cmd[count].character,&cmd[count].explain,&cmd[count].category);
            count++;
        }
    }else
        printf("fail to open");
    fclose(fp);

}
void Title()//打印标题
{
    printf("Microsoft Windows [版本 10.0.10586]\n");
    printf("(c) 2015 Microsoft Corporation。保留所有权利。\n");

}
void Processing(char *ch)//处理函数
{
    int i = 0;
    char key;
    if(!strcmp(ch, "help"))
    {
        for(i = 0; i < count; i++)
        {
            printf("%s\t", cmd[i].character);
            printf("%s\n", cmd[i].explain);
        }
    }else
    {
        for(i = 0; i < count; i++)
        {
            if(!strcmp(ch, cmd[i].character))
            {
                if(cmd[i].category == 1)
                    printf("%s为内部命令\n", cmd[i].character);
                else
                    printf("%s为外部命令\n", cmd[i].character);
                printf("作用是:%s\n", cmd[i].explain);
                getchar();//清除缓存
                printf("是否执行该命令(y/n):");
                scanf("%c", &key);
                if(key == 'y' || key == 'Y')
                    system(cmd[i].character);
                break;
            }
        }
        if(i == count)
            printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。\n", ch);
    }
}

int main(void)
{
    char ch[30];
    char *p;
    Init();    
    Title();
    do
    {
        printf("\nC:\\>");
        scanf("%s", ch);
        p = strlwr(ch);//将大写字符转化为小写字符
        Processing(p);
    }while(strcmp(ch, "quit"));

    return 0;
}
复制代码
posted @ 2016-03-21 20:22  50张国镜  阅读(896)  评论(0编辑  收藏  举报