实验一 命令解释程序的编写
一、目的和要求
- 掌握命令解释程序的原理;
- 掌握简单的DOS调用方法;
- 掌握C语言编程初步。
二、实验要求
编写类似于DOS,UNIX的命令行解释程序
- 自行定义系统提示符
- 自定义命令集
- 用户输入HELP以查找命令的帮助
- 列出命令的功能,区分内部还是外部命令
- 用户输入QUIT退出
- 内部命令有dir,cd,md,rd,cls,date,time,ren,copy等
三、编程实现流程
显示程序提示信息;
While(1)
{ 显示提示符;
接收键盘的字符串;
判断是否quit程序退出指令,是则退出;
判断是否内部命令,并给出相应的信息,否则给出错误信息;
}
显示退出程序信息;
具体实现:
- 整体体现
本程序利用C语言文件存储的方式实现cmd命令相关信息的存储,相关代码片段为:
FILE *fp;
fp=fopen("E:\caozuo.txt","a+");打开文件,采用可写入方式,原文件夹的文件不会覆盖,将会在文件最后面加上。
fclose(fp);关闭文件。
2.显示提示符
显示界面输入,界面如下:
3.接收键盘的字符串;
接受键盘输入的字符串,输入的字符串采用结构体的方法实现,存储到TXT文件中,可以方便一直使用。具体实现代码如下:
1 void input() 2 { FILE *fp; 3 fp=fopen("E:\caozuo.txt","a+"); 4 int i; 5 int n; 6 printf("请输入你要录入的个数n :"); 7 scanf("%d",&n); 8 for(i=0;i<n;i++) 9 { 10 printf("输入cmd命令符 :"); 11 scanf("%s",cmd[i].name); 12 printf("输入cmd命令符类型 :"); 13 scanf("%s",cmd[i].type); 14 printf("输入cmd命令符功能 :"); 15 scanf("%s",cmd[i].function); 16 fwrite(&cmd[i],sizeof(struct cmd),1,fp); 17 }
上面这段是录入信息的代码片段。
接受键盘输入命令符进行判断则定义一个数组search[]和已有的存储的信息进行判断,例如:
char search[5];
scanf("%s",search);
判断语句(部分):if(strcmp(search,other[i])==0)
4.判断是否quit程序退出指令,是则退出;并显示退出程序信息
实现代码:
1 for(i=0;i<2;i++) 2 { 3 if(strcmp(search,another[i])==0) 4 { printf(" quit 外部命令 将退出命令解释程序 "); 5 printf(" "); 6 printf("程序结束 "); 7 printf(" "); 8 9 exit (0); 10 }
实现结果如图:
5.判断是否内部命令,并给出相应的信息,否则给出错误信息;
判断(随机):
四、实验拓展
实现大小写的输入:
本程序主要是实现大写转为小写即可,小写能实现:
实现具体代码为:
1 for( i=0;i<strlen(search);i++) 2 { 3 search[i] = tolower(search[i]); 4 5 }
实现此功能需要加上头文件#include <string.h>和#include <ctype.h>
实现结果为:
五:实验总结
了解了cmd的运行与实现,和最基础的命令相关信息。
六、源程序为:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <ctype.h> 5 #define N 10 6 7 typedef struct cmd 8 { 9 char name[5]; 10 char type[10]; 11 char function[30]; 12 }CMD; 13 CMD cmd[N]; 14 15 void input() 16 { FILE *fp; 17 fp=fopen("E:\caozuo.txt","a+"); 18 int i; 19 int n; 20 printf("请输入你要录入的个数n :"); 21 scanf("%d",&n); 22 for(i=0;i<n;i++) 23 { 24 printf("输入cmd命令符 :"); 25 scanf("%s",cmd[i].name); 26 printf("输入cmd命令符类型 :"); 27 scanf("%s",cmd[i].type); 28 printf("输入cmd命令符功能 :"); 29 scanf("%s",cmd[i].function); 30 fwrite(&cmd[i],sizeof(struct cmd),1,fp); 31 } 32 fclose(fp); 33 } 34 35 /*void convert() 36 { 37 char search[5]; 38 for(int i=0;i<strlen(search);i++) 39 { 40 search[i] = tolower(search[i]); 41 42 } 43 }*/ 44 void searchone() 45 { int i; 46 char other[6][6]={"help"}; 47 char another[6][6]={"quit"}; 48 char a[]="C:\Users\Administrator>"; 49 FILE *fp; 50 fp=fopen("E:\caozuo.txt","rb"); 51 52 char search[5]; 53 54 printf("%s:",a); 55 56 scanf("%s",search); 57 58 for( i=0;i<strlen(search);i++) 59 { 60 search[i] = tolower(search[i]); 61 62 } 63 for(i=0;i<2;i++) 64 { 65 if(strcmp(search,another[i])==0) 66 { printf(" quit 外部命令 将退出命令解释程序 "); 67 printf(" "); 68 printf("程序结束 "); 69 printf(" "); 70 71 exit (0); 72 } 73 else 74 if(strcmp(search,other[i])==0) 75 { 76 printf("help 外部命令 提供Windows命令的帮助信息 "); 77 printf("有关某个命令的详细信息,请键入 help 命令名 "); 78 printf(" "); 79 for(i=0;fread(&cmd[i],sizeof(struct cmd),1,fp)==1;i++) 80 { 81 82 printf(" %s %s %s ",cmd[i].name,cmd[i].type,cmd 83 84 [i].function); 85 86 } 87 fclose(fp); 88 89 } 90 91 else 92 93 for(i=0;i<20;i++) 94 { 95 fread(&cmd[i],sizeof(struct cmd),1,fp); 96 if(strcmp(search, cmd[i].name)==0) 97 printf(" %s %s %s ",cmd[i].name,cmd[i].type,cmd 98 99 [i].function); 100 101 } 102 103 104 fclose(fp); 105 106 } 107 } 108 109 110 111 main() 112 { 113 int j=1;int i; 114 115 printf("Microsoft Windows [版本 6.1.7601] "); 116 printf("版权所有 (c) 2009 Microsoft Corporation。 保留所有权利。 "); 117 printf(" "); 118 //input (); 119 120 while(j==1) { searchone(); } 121 122 }