实验一、命令解释程序的编写实验

                              实验一、命令解释程序的编写实验


                        专业:商业软件工程 姓名:郑培轩 学号:201406114117


一、 实验目的
(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 #include<stdio.h>//stdio 就是指 “standard input & output"(标准输入输出)
  2                 //所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!
  3                 //例如c语言中的 printf("%d",i); scanf("%d",&i);等函数
  4 #include<string.h>//在使用到字符数组时需要使用
  5 #include<stdlib.h>
  6 #define Max 500
  7 /*自定义结构体
  8 *    cmd   命令名
  9 *    function   命令功能
 10 *    post  用1和0标识,是内部指令,还是外部指令
 11 */
 12 struct Cmd{
 13     char cmd[30];
 14     char function[500];
 15     int post;
 16 };
 17 
 18 int count=0;
 19 
 20 /*文件读取操作
 21 */
 22 void Init(struct Cmd cm[Max])
 23 {
 24     FILE *fp;
 25     if((fp=fopen("cmd.txt","a+"))==NULL)  //fopen函数用于获取一个文件指针   a+:    打开或新建一个文本文件,可以读,但只允许在文件末尾追写
 26     {
 27         printf("File open error!\n");
 28         exit(0);
 29     }
 30     //fgetc()这个函数是返回读取的一个字节。如果读到文件末尾返回EOF,EOF是一个宏,它的值等于-1
 31     //feof()输入输出函数,检查文件是否结束,如结束,则返回非零值,否则返回0 
 32     while(!feof(fp)&&fgetc(fp)!=EOF)    
 33     {    
 34         /*重定位流(数据流/文件)上的文件内部位置指针
 35       *注意:不是定位文件指针,文件指针指向文件/流。
 36         *位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。
 37         *第一个参数stream为文件指针
 38          *第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
 39       *第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
 40       *SEEK_SET: 文件开头
 41       *SEEK_CUR: 当前位置
 42       *SEEK_END: 文件结尾
 43       *其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
 44         */
 45         fseek(fp,-1L,SEEK_CUR);
 46         //对文件内容的读取,并将读取的内容存入链表Cmd中
 47         fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post);
 48         count++;
 49     }
 50     if(fclose(fp))//关闭文件指针
 51     {
 52         printf("Can not close the file!\n");
 53         exit(0);
 54     }
 55 }
 56 
 57 /*
 58  *    输出从文件读取的所有内容
 59  */
 60 void display(struct Cmd cm[Max])
 61 {
 62     for(int i=0;i<count;i++)
 63     {
 64         printf("%-10s%s\n",strupr(cm[i].cmd),cm[i].function);
 65         strlwr(cm[i].cmd);
 66     }
 67 }
 68 /*
 69  *    对用户输入的字符串进行识别和查找
 70  */
 71 void process(struct Cmd cm[Max])
 72 {
 73     char str[10];
 74     printf("Microsoft Windows XP [版本 5.1.2600]\n");      
 75     printf("(C) 版权所有 1985-2001 Microsoft Corp.\n");
 76     while(strcmp(str,"quit")!=0){   //判断用户输入命令是不是quit
 77         printf("\nC:\\Documents and Settings\\hskd>");
 78         //scanf("%s",str);
 79         gets(str); 
 80         strlwr(str);    //char *strlwr(char *a)功能:将字符串a转换为小写形式
 81                         //char *strupr(char *a)功能:把字符串a中的串转换成大写
 82         bool flag=false;
 83         char dir[3]={'d','i','r'}; //作为判断标准
 84         if(strcmp(str,"help")==0)   //判断用户输入命令是不是help
 85         {
 86             printf("有关某个命令的详细信息,请键入 HELP 命令名\n");
 87             display(cm);
 88             flag=true;    //用于判断用户输入的字符串是否在cm中找得到的标识
 89         }else{
 90             for(int i=0;i<count;i++)
 91             {
 92                 if(strcmp(str,cm[i].cmd)==0)    //把用户输入的字符串 在数组cm中查找,找到并输出
 93                 {
 94                     if(cm[i].post==1){
 95                         if(strcmp(str,dir))//如果字符串是dir
 96                             system(dir);//调用system命令执行dir命令
 97                         else
 98                             printf("'%s' 内部命令输入正确!\n该命令作用是:%s\n",str,cm[i].function);
 99                     }else
100                         printf("'%s' 外部命令输入正确!\n该命令作用是:%s\n",str,cm[i].function);
101                     flag=true;
102                     break;
103                 }
104                 
105             }
106             if(!flag){    //当找不到执行下面语句
107                 if(strcmp(str,"quit")!=0)
108                     printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。\n",str);
109             }
110         }
111     }
112     printf("\n程序结束!\n\n");    //程序运行结束标志
113 }
114 int main()
115 {
116     struct Cmd cm[Max];
117     Init(cm);
118     process(cm);
119     return 0;
120 }

2. 运行结果及分析

 

 

四、 实验总结

能够了解整个程序的运行过程以及其中的c语言代码,原来想通过findfirst和findnext(获得一个指定文件夹下面的所有文件的信息)来完成dir命令

最后发现有难度,而且想到我们要的是通过这个程序来更好的了解操作系统,所以我就放弃了在这个小程序上使用这两个方法,但是课后会再去花时

间研究一下。

posted on 2016-03-25 15:22  17郑培轩  阅读(340)  评论(0编辑  收藏  举报