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

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

一、目的和要求

  1. 掌握命令解释程序的原理;
  2. 掌握简单的DOS调用方法;
  3. 掌握C语言编程初步。

二、实验要求

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

  1. 自行定义系统提示符
  2. 自定义命令集
  3. 用户输入HELP以查找命令的帮助
  4. 列出命令的功能,区分内部还是外部命令
  5. 用户输入QUIT退出
  6. 内部命令有dir,cd,md,rd,cls,date,time,ren,copy等

 三、编程实现流程

显示程序提示信息;

While(1)

{ 显示提示符;

接收键盘的字符串;

判断是否quit程序退出指令,是则退出;

判断是否内部命令,并给出相应的信息,否则给出错误信息;

 }

显示退出程序信息;

具体实现:

  1. 整体体现

    本程序利用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 }

 

转载于:https://www.cnblogs.com/Ranjer/p/5317626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验将介绍如何编写一个简单的字符设备驱动程序。该驱动程序将创建一个虚拟设备,允许用户在设备上进行读写操作。 步骤1:创建设备文件 首先需要创建一个设备文件,可以使用以下命令: ``` sudo mknod /dev/mydevice c 240 0 ``` 这将创建名为“mydevice”的字符设备文件,并将其与主设备号240和次设备号0相关联。主设备号是设备驱动程序的标识符,次设备号指定设备的实例编号。 步骤2:定义设备结构体 下一步是定义一个设备结构体,该结构体将包含设备的状态信息和操作函数。例如: ```c struct mydevice { struct cdev cdev; //字符设备结构体 char *data; //设备数据缓冲区 int size; //缓冲区大小 }; ``` 其中,cdev是字符设备结构体,data是设备的数据缓冲区,size是缓冲区的大小。 步骤3:实现设备操作函数 接下来需要实现设备操作函数,包括读取和写入函数。例如: ```c static ssize_t mydevice_read(struct file *file, char __user *buf, size_t count, loff_t *offset) { struct mydevice *dev = file->private_data; if (*offset >= dev->size) return 0; if (*offset + count > dev->size) count = dev->size - *offset; if (copy_to_user(buf, dev->data + *offset, count)) return -EFAULT; *offset += count; return count; } static ssize_t mydevice_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) { struct mydevice *dev = file->private_data; if (*offset >= dev->size) return -ENOSPC; if (*offset + count > dev->size) count = dev->size - *offset; if (copy_from_user(dev->data + *offset, buf, count)) return -EFAULT; *offset += count; return count; } ``` 其中,mydevice_read函数用于从设备中读取数据,mydevice_write函数用于向设备中写入数据。这些函数将返回读取或写入的字节数,或者在出现错误时返回负值。 步骤4:初始化设备 接下来需要实现设备的初始化函数,该函数将在设备驱动程序加载时调用。例如: ```c static int mydevice_init(struct mydevice *dev) { int err; dev->data = kmalloc(MAX_SIZE, GFP_KERNEL); if (!dev->data) { err = -ENOMEM; goto fail; } memset(dev->data, 0, MAX_SIZE); dev->size = MAX_SIZE; cdev_init(&dev->cdev, &mydevice_fops); dev->cdev.owner = THIS_MODULE; err = cdev_add(&dev->cdev, MKDEV(MAJOR_NUM, MINOR_NUM), 1); if (err) { kfree(dev->data); goto fail; } return 0; fail: return err; } ``` 其中,mydevice_init函数创建设备的数据缓冲区,初始化字符设备结构体,并将其添加到系统中。 步骤5:实现设备驱动程序 最后,需要实现设备驱动程序,包括设备的注册和注销函数。例如: ```c static int mydevice_register(void) { int err; dev_t devno = MKDEV(MAJOR_NUM, MINOR_NUM); err = register_chrdev_region(devno, 1, "mydevice"); if (err) goto fail; mydevice_dev = kmalloc(sizeof(struct mydevice), GFP_KERNEL); if (!mydevice_dev) { err = -ENOMEM; goto unregister; } err = mydevice_init(mydevice_dev); if (err) { kfree(mydevice_dev); goto unregister; } return 0; unregister: unregister_chrdev_region(devno, 1); fail: return err; } static void mydevice_unregister(void) { dev_t devno = MKDEV(MAJOR_NUM, MINOR_NUM); cdev_del(&mydevice_dev->cdev); kfree(mydevice_dev->data); kfree(mydevice_dev); unregister_chrdev_region(devno, 1); } ``` 其中,mydevice_register函数用于注册设备,mydevice_unregister函数用于注销设备。 完成以上步骤后,就可以编译和加载设备驱动程序了。加载驱动程序后,用户可以通过访问/dev/mydevice文件进行读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值