實驗一 命令解釋程式的編寫
一、目的和要求
- 掌握命令解釋程式的原理;
- 掌握簡單的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 }