Shell(C++实现,CodeBlocks+GCC编译)
程序效果:
只实现了login 、cd 、ls 、cat 四个命令。而且只能在 Windows 下运行。

代码:
//main.cpp 1 #include <iostream>
#include "shell.h"
using namespace std;
int com_to_int(int com_num,char * command,char** coms){
;
}
int main()
{
;
char command[MAX_LENGTH_OF_COMMAND];
char *coms[COM_NUM]={"login","ls","cd","cat","exit"};
int (*func_ptrs[COM_NUM])(char *)={login,ls,cd,cat,shellexit};
while(true){
printf("%s%s%s%s%s","[",USER_NAME," ",GLOBLE_PATH,"]");
gets(command);
){
continue;
}
//printf("command: %s\n",command);
//printf("command: %s\n",command);
int i;
;i<COM_NUM;i++){
){
func_ptrs[i](command);
break;
}
}
if(i==COM_NUM){
printf("command not found.\n");
}
}
cd("C:/0");
ls(GLOBLE_PATH);
;
}
//shell.h 1 #ifndef SHELL_H_INCLUDED
#define SHELL_H_INCLUDED
#include<io.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MAX_LENGTH_OF_PATH 256
#define MAX_LENGTH_OF_USERNAME 50
#define MAX_LENGTH_OF_COMMAND 50
#define MAX_LENGTH_OF_LINE 256
','\0'};
char USER_NAME[MAX_LENGTH_OF_USERNAME]= {'g','u','e','s','t','\0'};
int login(char * command)
{
printf("user name:");
char username[MAX_LENGTH_OF_USERNAME];
gets(username);
FILE * pwd;
pwd = fopen ("pwd","r");
if (pwd!=NULL)
{
char line[MAX_LENGTH_OF_LINE];
while (!feof(pwd))
{
if(fgets(line,MAX_LENGTH_OF_LINE,pwd)!=NULL)
{
char * name=strtok(line," ");
//printf("%s\n",name);
)
{
char password[MAX_LENGTH_OF_USERNAME];
printf("password:");
gets(password);
char * pasw=strtok(NULL," \n\r");
//printf("file password:%s\n",pasw);
)
{
strcpy(USER_NAME,username);
}
else
{
printf("wrong password.\n");
}
fclose (pwd);
;
}
}
}
printf("user not exist.\n");
fclose (pwd);
}
else
{
printf("login error.pwd file not exist or not able to open.\n");
}
;
}
int shellexit(char * command)
{
exit();
;
}
int cat_file(char * file_path)
{
FILE* f=fopen(file_path,"r");
if(f==NULL)
{
printf("file does not exist.\n");
;
}
char line[MAX_LENGTH_OF_LINE];
while(!feof(f))
{
fgets(line,MAX_LENGTH_OF_LINE,f);
;i<strlen(line);i++){
if(line[i]=='\0')break;
printf("%c",line[i]);
}
}
printf("\n");
;
}
int cat(char * command)
{
char * path=strtok(command," ");
path=strtok(NULL," ");
//printf("path:%s",path);
cat_file(path);
;
}
int cd_path(char *path)
{
struct _finddata_t f;
int p;
//printf("1");
/* FILE * pFile;
pFile = fopen (path,"r");
if (pFile!=NULL)
{ printf("2");
}printf("3");*/
)
{
//printf("%d",p);
//printf("2");
//printf(" %d ",f.attrib);
if(f.attrib&_A_SUBDIR)
{
//printf("4");
strcpy(GLOBLE_PATH,path);
;
}
else
{
printf("destination path is not a folder.\n");
}
}
else
{
printf("destination not exist.\n");
}
;
}
int cd(char * command)
{
char * path=strtok(command," ");
path=strtok(NULL," ");
//printf("path:%s",path);
cd_path(path);
;
}
int ls_path(char * path)
{
struct _finddata_t f;
int p;
char name[MAX_LENGTH_OF_PATH];
strcpy(name,path);
strcat(name,"/*");
//printf("1");
)
{
//read(p,filename,)
//printf("2");
printf(f.name);
printf("\n");
)
{
printf(f.name);
printf("\n");
}
}
else
{
}
;
}
int ls(char * command)
{
char * path=strtok(command," ");
path=strtok(NULL," ");
//printf("path:%s",path);
)
{
ls_path(GLOBLE_PATH);
}
else
{
ls_path(path);
}
;
}
#endif // SHELL_H_INCLUDED
外部资源文件:
pwd(login 命令使用):
ma xue wei
程序写于大三下学期,2016年3月。
2016.4.12更新博客。
END
Shell(C++实现,CodeBlocks+GCC编译)的更多相关文章
- 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)
目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...
- 简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)
说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到 ...
- 俄罗斯方块(Win32实现,Codeblocks+GCC编译)
缘起: 在玩Codeblocks自带的俄罗斯方块时觉得不错,然而有时间限制.所以想自己再写一个. 程序效果: 主要内容: 程序中有一个board数组,其中有要显示的部分,也有不显示的部分,不显示的部分 ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- GLine游戏(Win32GUI实现,CodeBlocks+GCC编译)
游戏规则: 在10X10的棋盘上有五种颜色的棋子. 点击一个棋子,再点击一个空格子,如果两者之间有一条路径的话,棋子会移动到空格子内. 每移动一次,棋盘上会增加三个棋子,其位置和颜色都是随机的. 当横 ...
- Socket服务端和客户端(C++,CodeBlocks+GCC编译)
//main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...
- 抓鼠标的猫(Win32实现,Codeblocks+GCC编译)
程序效果: 猫的眼睛一直跟着鼠标移动: 鼠标经过猫的右脚附近时,猫会抓住鼠标.(未使用Hook) 代码: //main.cpp 1 #include <windows.h> #includ ...
- GCC 编译详解
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...
- 在Linux使用GCC编译C语言共享库
在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...
随机推荐
- Win10计算器在哪里?三种可以打开Win10计算器的方法图文介绍
全新的windows10系统带来了不少新的特性和改变,其中win10的计算器位置就发生了很多的变化,导致很多网友们都以为win10计算器不见了,那么,win10计算器在哪里?如何打开?针对此问题,本文 ...
- 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合
[源码下载] 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合 作 ...
- sql执行循序
(8) select (9) distinct (11) top 1 (6) Table1.id,COUNT(Table1.name) as nameCount (1) from Table1 (3) ...
- Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
回到目录 Lind.DDD框架里提出了对数据集的控制,某些权限的用户为某些表添加某些数据集的权限,具体实现是在一张表中存储用户ID,表名,检索字段,检索值和检索操作符,然后用户登陆后,通过自己权限来构 ...
- [Tool] SourceTree操作中遇到错误(Filename too long)的解决方案
[Tool] SourceTree操作中遇到错误(Filename too long)的解决方案 问题情景 使用SourceTree,可以方便开发人员使用图形化接口的Git指令来管理原始码.但是在Wi ...
- Java线程
线程 线程 线程(Thread)是控制线程(Thread of Control)的缩写,是程序运行的基本单位,它是具有一定顺序的指令序列(即所编写的程序代码).存放方法中定义局部变量的栈和一些共享数据 ...
- 使用ArcGIS JavaScript API 3.18 加载天地图
对于中国开发者在创建GIS应用的时候,往往比较头疼的是底图资源的缺乏.其实国家测绘地信局就提供一个很好的免费资源:天地图.使用ArcGIS API的开发人员可以直接利用该资源作为地图应用的底图. Ar ...
- Objective-C Runtime 运行时之四:Method Swizzling
理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...
- ToolBar和DrawerLayout的使用实现侧拉栏抽屉的开闭
1.如图可以看到textColorPrimary,colorPrimary,colorPrimaryDark,navigationBarColor等颜色属性代表的相应位置,如下图 2.具体属性在res ...
- js中A包含B的写法与分割字符串的方法
在java中A包含B的写法 if(A.contains(B)){ ... } 在js中没有contains方法,应该使用下面这种方法: var an = "传染性.潜伏性.破坏性" ...