实验一 命令解释程序的编写
一、目的和要求
- 掌握命令解释程序的原理;
- 掌握简单的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\n:");
7 scanf("%d",&n);
8 for(i=0;i<n;i++)
9 {
10 printf("输入cmd命令符\n:");
11 scanf("%s",cmd[i].name);
12 printf("输入cmd命令符类型\n:");
13 scanf("%s",cmd[i].type);
14 printf("输入cmd命令符功能\n:");
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 外部命令 将退出命令解释程序 \n");
5 printf("\n");
6 printf("程序结束\n ");
7 printf("\n");
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\n:");
21 scanf("%d",&n);
22 for(i=0;i<n;i++)
23 {
24 printf("输入cmd命令符\n:");
25 scanf("%s",cmd[i].name);
26 printf("输入cmd命令符类型\n:");
27 scanf("%s",cmd[i].type);
28 printf("输入cmd命令符功能\n:");
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 外部命令 将退出命令解释程序 \n");
67 printf("\n");
68 printf("程序结束\n ");
69 printf("\n");
70
71 exit (0);
72 }
73 else
74 if(strcmp(search,other[i])==0)
75 {
76 printf("help 外部命令 提供Windows命令的帮助信息\n");
77 printf("有关某个命令的详细信息,请键入 help 命令名\n");
78 printf("\n");
79 for(i=0;fread(&cmd[i],sizeof(struct cmd),1,fp)==1;i++)
80 {
81
82 printf(" %s %s %s \n",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 \n",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]\n");
116 printf("版权所有 (c) 2009 Microsoft Corporation。 保留所有权利。\n");
117 printf(" \n");
118 //input ();
119
120 while(j==1) { searchone(); }
121
122 }