实验一、命令解释程序的编写实验
实验一、命令解释程序的编写实验
专业:商业软件工程 姓名:郑培轩 学号: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命令
最后发现有难度,而且想到我们要的是通过这个程序来更好的了解操作系统,所以我就放弃了在这个小程序上使用这两个方法,但是课后会再去花时
间研究一下。