一、实验目的
(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;
}


#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;
}
