操作系统模仿CMD
实验一、命令解释程序的编写
专业:商软(2)班 姓名:列志华 学号:201406114254
一、 实验目的
(1)掌握命令解释程序的原理;
(2)掌握简单的DOS调用方法;
(3)掌握C语言编程初步。
二、 实验内容和要求
编写类似于DOS,UNIX的命令行解释程序
(1)自行定义系统提示符
(2)自定义命令集(8-10个)
(3)用户输入HELP以查找命令的帮助
(4)列出命令的功能,区分内部还是外部命令
(5)用户输入QUIT退出
(6)内部命令有dir, cd, md, rd, cls, date, time, ren, copy等。
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件中源程序名 MiniOS.cpp
可执行程序名:MiniOS.exe
2. 原理分析及流程图
本次实验主要是把命令放到记事本里面,最后通过程序来读取文档,这样的做法主要是方便更改数据。
在程序里建一个命令结构体,里面包含了命令名、命令功能、判断内部或外部命令的编号、参数,如:
typedef struct node
{
char order[];
char exp[];
int post;
int arg;
struct node *next;
}ORDER;
最后通过用户输入的字符串,比较是否与记事本里面的命令名一样,相同则输出该命令的所有信息,
若不同则输出该命令不是内部命令或外部命令。如果用户输入exit,则程序结束。
3. 主要程序段及其解释
/*
完成时间: 3.22 22:30 pm
首次发表时间:3.22 22:53 pm
修改时间: 3.24 22:09 pm
*/ #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<cstdlib> typedef struct node
{
char order[];
char exp[];
int post;
int arg;
struct node *next;
}ORDER;
int saveflag = ; void initInfo(ORDER *head)
{
ORDER *p,*z;
FILE *fp1;
int i;
z = head;
if((fp1 = fopen("cmd_1.txt", "a+")) == NULL)
{ //打开命令文件
printf("cmd_1.txt is NULL!!!");
return;
} for(i = ; !feof(fp1)&&fgetc(fp1)!=EOF ; i++)
{
p=(ORDER*)malloc(sizeof(ORDER));
fseek(fp1,-1L,SEEK_CUR);
fscanf(fp1,"%s%s%d%d",&p->order,&p->exp,&p->post,&p->arg);
p->next=NULL ;
z->next=p;/*构造链表*/
z=p;
}
fclose(fp1);
} //用于把大写字母转为小写字母
char toDownCase(char ch)
{
if(( 'A' <= ch) &&(ch <= 'Z'))
{
return (ch + );
}
return ch;
} //对用户的输入进行识别。
void discern(ORDER *head)
{
ORDER *p;
char user[];
int i = ,flag = ;
while()
{
printf("C:\\Users\\Administrator>");
scanf("%s",&user);
for(i= ; user[i] != '\0' ; i++)
user[i] = toDownCase(user[i]);
if(strcmp(user,"exit") == )
{ flag = ;
exit();
}
else if(strcmp(user,"help") == )
{
printf("有关某个命令的详细信息,请键入 HELP 命令名\n");
p = head->next;
while(p != NULL)
{ printf("%-9s%s\n",p->order,p->exp);
p = p->next;
}
flag = ;
printf("\n");
}
else if((strcmp(user,"\n") == ))
{
continue;
flag = ;
}
else
{
p = head->next;
flag = ;
while(p != NULL)
{
if(strcmp(user,p->order) == )
{
if(p->post == && p->arg == )
{
printf("‘%s’内部命令输入正确!\n",p->order);
printf("作用是:%s\n\n",p->exp);
}
else if(p->post == && p->arg == )
{
printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",p->order);
}
else
{
printf("命令语法不正确。没有参数!!!\n");
}
flag = ; }
p=p->next;
}
}
if(flag == )
{
printf("'%s' 不是内部或外部命令,也不是可运行的程序或批处理文件。\n",user);
} }
} void main()
{
ORDER *head,*p,*z; //系统的命令集合,和解析。
char user[]; //用户的输入。 head = (ORDER*)malloc(sizeof(ORDER));
head->next =NULL; printf("Microsoft Windows XP [版本 5.1.2600]\n");
printf("(C) 版权所有 1985-2001 Microsoft Corp.\n\n"); initInfo(head);
discern(head); }

测试结果与预期结果一样。
四、 实验总结
通过本次实验我进一步加深了对结构体和数组的了解,也学会了如何通过C语言读取记事本里面的数据内容。
通过询问同学和上网搜索相关知识,最后还是成功地解决了问题。
操作系统模仿CMD的更多相关文章
- 实验一 操作系统模仿cmd
实验一.命令解释程序的编写 专业:商软(2)班 姓名:王俊杰 学号:201406114252 一. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3 ...
- cmd:WIN7操作系统下cmd窗口下的复制粘贴
1.右击cmd的顶部栏,点开属性 2.在 选项 下,勾选"快速编辑模式" 3.按住鼠标左键标注需要复制的区域 再点击一下右键,则上文的标记区域就已经被复制了,可以通过ctrl+v进 ...
- windows10操作系统中cmd窗口下telnet功能失效的解决方案
查找windows自带功能,在window10中相当方便.打开windows10的设置面板,在搜索栏中搜索“windows功能”,弹出以下界面: 根据弹出的提示“启动或停用windows功能”即可弹出 ...
- [Java] cmd命令行如何切换目录
cmd.exe是微软Windows系统基于WINDOWS上的命令解释程序,类似于微软的DOS操作系统.cmd.exe是一个32位的命令行程序,运行在Windows NT/2000/XP/2003/vi ...
- SQL Server代理(2/12):作业步骤和子系统
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. SQL Server代理作业有一系列的一个 ...
- SQL Server代理(1/12):配置和概况
SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. SQL Server代理是SQL Serv ...
- windows注册表学习笔记
注册表,想起来了就学学,方便操作.无需把它当成重要学问,今日就学一波,作为了解. 一.注册表清理脚本 主要是删除临时文件,旧文件.并不能够删除无效的键 @echo off del/f/s/q %sys ...
- 关于oracle数据库(1)
兼容性的设置 cmd.exe是微软Windows系统的命令行程序,类似于微软的DOS操作系统.cmd.exe是一个16/32位的命令行程序,运行在Windows NT/2000/XP/2003/Vis ...
- ODI 创建Java EE Agent
Configuring the Domain for the Java EE Agent 一 创建数据库 Schema 配置 Java EE agent,之前,必须保证在数据中创建了相应的scheme ...
随机推荐
- Hbase原理
Hbase原理 概述 HBase是一个构建在HDFS上的分布式列存储系统:HBase是基于Google BigTable模型开发的,典型的key/value系统:HBase是Apache Hadoop ...
- ssh 连接ubuntu的虚拟机问题
我在winxp的虚拟机上装了一个ubuntu9.04的系统,winxp的ip为10.118.62.157,ubuntu的ip为192.168.116.1 两个ip互相ping都是正常的,但是,我在wi ...
- iOS UIWebView 捕获403 、404错误
#pragma mark -#pragma mark - UIWebView Delegate Methods- (BOOL)webView:(UIWebView *)webView shouldSt ...
- 一起刑事案件法庭辩护 z
[案件地位] 这是一起各方争议很大的刑事案件.侦查机关曾将该案以非法拘禁罪立案侦查,以故意杀人罪移送检察机关审查起诉,公诉机关以非法拘禁形成故意伤害(致死)起诉,而法院最终以故意伤害罪判决,并且排除 ...
- 查看Oracle的SID用户名等信息
源地址:http://zhidao.baidu.com/question/681563406501077052.html 用sysdba身份登录 比如 conn /as sysdba 匿名管理员登陆 ...
- /dev/shm
/dev/shm/是linux下一个特殊的目录,因为这个目录不在硬盘上,而是在内存里. /dev /shm/需要注意的一个是容量问题,在linux下,它默认最大为内存的一半大小,使用df -h命令可以 ...
- Inno Setup执行SQL脚本的方法
作为和NSIS并立的.两个最流行的免费Windows应用程序安装包制作工具之一,Inno在学习难度上相对要低一些,非常适合对一些简单的桌面程序打包.但对于较复杂的安装过程,或者Web应用程序来说,我个 ...
- 一些代码 I (斐波那契、for...else...、try和return、classmethod、统计个数)
1. 斐波那契 from itertools import islice def fib(): a, b = 0, 1 while True: yield a a, b = b, a+b print ...
- [DataTable]C# datatable取最大值最小值
ArrayList al = new ArrayList(); DataTable dt = new DataTable(); dt.Columns.Add("A",typeof( ...
- 关于前置式递增和后置式递增的小知识(++x与x++)
list<char>::iterator pos; //list<char> coll; for(pos=coll.begin();pos!=coll.end();++pos) ...