实验一 命令解释程序的编写
一、目的和要求
1. 实验目的
(1)掌握命令解释程序的原理;
(2)掌握简单的DOS调用方法;
(3)掌握C语言编程初步。
2.实验要求
编写类似于DOS,UNIX的命令行解释程序
(1)自行定义系统提示符
(2)自定义命令集(8-10个)
(3)用户输入HELP以查找命令的帮助
(4)列出命令的功能,区分内部还是外部命令
(5)用户输入QUIT退出
(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。
二、实验内容
根据教师指定的实验课题,完成设计、编码、测试工作。
三、实验环境
1.PC微机
2.Windows 操作系统
3.C/C++程序开发集成环境
四、实验原理及核心算法参考程序段
命令解释程序的主要功能是:
1.实现功能:
简单的实现了cmd的功能,如dir,time,help等等。
2.参考结果图:
3.程序代码:
#include<stdio.h>//stdio 就是指 “standard input & output"(标准输入输出) //所以,源代码中如用到标准输入输出函数时,就要包含这个头文件! //例如c语言中的 printf("%d",i); scanf("%d",&i);等函数 #include<string.h>//在使用到字符数组时需要使用 #include<stdlib.h> #define Max 500 /*自定义结构体 * cmd 命令名 * function 命令功能 * post 用1和0标识,是内部指令,还是外部指令 */ struct Cmd{ char cmd[30]; char function[500]; int post; }; int count=0; /*文件读取操作 */ void Init(struct Cmd cm[Max]) { FILE *fp; if((fp=fopen("cmd.txt","a+"))==NULL) //fopen函数用于获取一个文件指针 a+: 打开或新建一个文本文件,可以读,但只允许在文件末尾追写 { printf("File open error! "); exit(0); } //fgetc()这个函数是返回读取的一个字节。如果读到文件末尾返回EOF,EOF是一个宏,它的值等于-1 //feof()输入输出函数,检查文件是否结束,如结束,则返回非零值,否则返回0 while(!feof(fp)&&fgetc(fp)!=EOF) { /*重定位流(数据流/文件)上的文件内部位置指针 *注意:不是定位文件指针,文件指针指向文件/流。 *位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。 *第一个参数stream为文件指针 *第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移 *第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET *SEEK_SET: 文件开头 *SEEK_CUR: 当前位置 *SEEK_END: 文件结尾 *其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2. */ fseek(fp,-1L,SEEK_CUR); //对文件内容的读取,并将读取的内容存入链表Cmd中 fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post); count++; } if(fclose(fp))//关闭文件指针 { printf("Can not close the file! "); exit(0); } } /*输出从文件读取的所有内容 */ void display(struct Cmd cm[Max]) { for(int i=0;i<count;i++) { printf("%-10s%s ",strupr(cm[i].cmd),cm[i].function); strlwr(cm[i].cmd); } } /*对用户输入的字符串进行识别和查找 */ void process(struct Cmd cm[Max]) { char str[10]; while(strcmp(str,"quit")!=0){ //判断用户输入命令是不是quit system("cls"); printf("Microsoft Windows XP [版本 5.1.2600] "); printf("(C) 版权所有 1985-2001 Microsoft Corp. "); printf(" 学号:201406114116 :\>"); //scanf("%s",str); gets(str); fflush(stdin);//清除缓存区 strlwr(str); //char *strlwr(char *a)功能:将字符串a转换为小写形式 //char *strupr(char *a)功能:把字符串a中的串转换成大写 bool flag=false; if(strcmp(str,"help")==0) //判断用户输入命令是不是help { system(str); //display(cm); flag=true; //用于判断用户输入的字符串是否在cm中找得到的标识 }else{ for(int i=0;i<count;i++) { if(strcmp(str,cm[i].cmd)==0) //把用户输入的字符串 在数组cm中查找,找到并输出 { if(cm[i].post==1){ printf("'%s' 内部命令输入正确! 该命令作用是:%s ",str,cm[i].function); system(str); }else{ printf("'%s' 外部命令输入正确! 该命令作用是:%s ",str,cm[i].function); system(str); } flag=true; break; } } if(!flag){ //当找不到执行下面语句 if(strcmp(str,"quit")!=0){ printf("'%s' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 ",str); system(str); } } } system("pause"); } printf(" 程序结束! "); //程序运行结束标志 } int main() { struct Cmd cm[Max]; system("title 黄敏鹏");//设置cmd窗口标题 Init(cm); process(cm); return 0; }