实验一 命令解释程序
一、实验目的
(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. 源程序名:压缩包文件(rar或zip)中源程序名0311.c
可执行程序名:0311.exe
- 2. 原理分析及流程图
用文件读写的方式将命令及命令作用存入结构体数组
命令解释程序的原理:
命令解释程序的主要功能是:
接受和执行一条用户从键盘输入的命令,它通常保存一张命令名字(动词)表,其中记录着所有操作命令及其处理程序的入口地址或有关信息。
命令解释程序实现的两种方式 :
一种是它自身包含了命令的执行代码;
另一种是由专门的“系统程序” 实现,自身不含命令处理代码,也不进行处理,仅仅把这条命令对应的命令文件装入内存执行。
- 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; }