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

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

一、目的和要求

1. 实验目的

(1)掌握命令解释程序的原理;

(2)掌握简单的DOS调用方法;

(3)掌握C语言编程初步。

2.实验要求

编写类似于DOS,UNIX的命令行解释程序

(1)自行定义系统提示符

(2)自定义命令集(8-10个)

(3)用户输入HELP以查找命令的帮助

(4)列出命令的功能,区分内部还是外部命令

(5)用户输入QUIT退出

(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。

二、实验内容

根据教师指定的实验课题,完成设计、编码、测试工作。

、实验环境

1.PC微机

2.Windows 操作系统

3.C/C++程序开发集成环境

四、实验原理及核心算法参考程序段

命令解释程序的主要功能是:

  1.实现功能:

    简单的实现了cmd的功能,如dir,time,help等等。

  2.参考结果图:

      

      

  3.程序代码:

#include<stdio.h>//stdio 就是指 “standard input & output"(标准输入输出)
                //所以,源代码中如用到标准输入输出函数时,就要包含这个头文件!
                //例如c语言中的 printf("%d",i); scanf("%d",&i);等函数
#include<string.h>//在使用到字符数组时需要使用
#include<stdlib.h>
#define Max 500
/*自定义结构体
*    cmd   命令名
*    function   命令功能
*    post  用1和0标识,是内部指令,还是外部指令
*/
struct Cmd{
    char cmd[30];
    char function[500];
    int post;
};

int count=0;

/*文件读取操作
*/
void Init(struct Cmd cm[Max])
{
    FILE *fp;
    if((fp=fopen("cmd.txt","a+"))==NULL)  //fopen函数用于获取一个文件指针   a+:    打开或新建一个文本文件,可以读,但只允许在文件末尾追写
    {
        printf("File open error!\n");
        exit(0);
    }
    //fgetc()这个函数是返回读取的一个字节。如果读到文件末尾返回EOF,EOF是一个宏,它的值等于-1
    //feof()输入输出函数,检查文件是否结束,如结束,则返回非零值,否则返回0 
    while(!feof(fp)&&fgetc(fp)!=EOF)    
    {    
        /*重定位流(数据流/文件)上的文件内部位置指针
      *注意:不是定位文件指针,文件指针指向文件/流。
        *位置指针指向文件内部的字节位置,随着文件的读取会移动,文件指针如果不重新赋值将不会改变指向别的文件。
        *第一个参数stream为文件指针
         *第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
      *第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
      *SEEK_SET: 文件开头
      *SEEK_CUR: 当前位置
      *SEEK_END: 文件结尾
      *其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
        */
        fseek(fp,-1L,SEEK_CUR);
        //对文件内容的读取,并将读取的内容存入链表Cmd中
        fscanf(fp,"%s%s%d",&cm[count].cmd,&cm[count].function,&cm[count].post);
        count++;
    }
    if(fclose(fp))//关闭文件指针
    {
        printf("Can not close the file!\n");
        exit(0);
    }
}

/*输出从文件读取的所有内容
*/
void display(struct Cmd cm[Max])
{
    for(int i=0;i<count;i++)
    {
        printf("%-10s%s\n",strupr(cm[i].cmd),cm[i].function);
        strlwr(cm[i].cmd);
    }
}
/*对用户输入的字符串进行识别和查找
*/
void process(struct Cmd cm[Max])
{
    char str[10];

    while(strcmp(str,"quit")!=0){   //判断用户输入命令是不是quit
        system("cls");
        printf("Microsoft Windows XP [版本 5.1.2600]\n");      
        printf("(C) 版权所有 1985-2001 Microsoft Corp.\n");
        printf("\n学号:201406114116 :\\>");
        //scanf("%s",str);
        gets(str);
        fflush(stdin);//清除缓存区
        strlwr(str);    //char *strlwr(char *a)功能:将字符串a转换为小写形式
                        //char *strupr(char *a)功能:把字符串a中的串转换成大写
        bool flag=false;
        if(strcmp(str,"help")==0)   //判断用户输入命令是不是help
        {
            system(str);
            //display(cm);
            flag=true;    //用于判断用户输入的字符串是否在cm中找得到的标识
        }else{
            for(int i=0;i<count;i++)
            {
                if(strcmp(str,cm[i].cmd)==0)    //把用户输入的字符串 在数组cm中查找,找到并输出
                {
                    if(cm[i].post==1){
                        printf("'%s' 内部命令输入正确!\n该命令作用是:%s\n",str,cm[i].function);
                        system(str);
                    }else{
                        printf("'%s' 外部命令输入正确!\n该命令作用是:%s\n",str,cm[i].function);
                        system(str);
                    }
                    flag=true;
                    break;
                }
                
            }
            if(!flag){    //当找不到执行下面语句
                if(strcmp(str,"quit")!=0){
                    printf("'%s' 不是内部或外部命令,也不是可运行的程序\n或批处理文件。\n",str);
                    system(str);
                }
            }
        }
        system("pause");
    }
    printf("\n程序结束!\n\n");    //程序运行结束标志
}
int main()
{
    struct Cmd cm[Max];
    system("title 黄敏鹏");//设置cmd窗口标题
    Init(cm);
    process(cm);
    return 0;
}

 

posted @ 2016-03-25 15:22  huangmp  阅读(853)  评论(0编辑  收藏  举报