程序效果:

  只实现了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编译)的更多相关文章

  1. 局域网象棋游戏(C++实现,使用Socket,界面使用Win32,CodeBlocks+GCC编译)

    目录 成果 运行效果图 过程 1. 首先的问题是下棋的两端应该是什么样的? 2. 接下来的问题是怎么表示,怎么存储? 3. 然后应该怎么通信呢? 代码 main.cpp chinese_chess.h ...

  2. 简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)

    说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到 ...

  3. 俄罗斯方块(Win32实现,Codeblocks+GCC编译)

    缘起: 在玩Codeblocks自带的俄罗斯方块时觉得不错,然而有时间限制.所以想自己再写一个. 程序效果: 主要内容: 程序中有一个board数组,其中有要显示的部分,也有不显示的部分,不显示的部分 ...

  4. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  5. GLine游戏(Win32GUI实现,CodeBlocks+GCC编译)

    游戏规则: 在10X10的棋盘上有五种颜色的棋子. 点击一个棋子,再点击一个空格子,如果两者之间有一条路径的话,棋子会移动到空格子内. 每移动一次,棋盘上会增加三个棋子,其位置和颜色都是随机的. 当横 ...

  6. Socket服务端和客户端(C++,CodeBlocks+GCC编译)

    //main.cpp 1 #include "j_socket.h" #include <stdio.h> #include <pthread.h> ; j ...

  7. 抓鼠标的猫(Win32实现,Codeblocks+GCC编译)

    程序效果: 猫的眼睛一直跟着鼠标移动: 鼠标经过猫的右脚附近时,猫会抓住鼠标.(未使用Hook) 代码: //main.cpp 1 #include <windows.h> #includ ...

  8. GCC 编译详解

    GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...

  9. 在Linux使用GCC编译C语言共享库

    在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...

随机推荐

  1. zigbee 路由节点丢失后清除 该节点的残余网络信息

    清除脱离网络的 路由节点(stale device)的 残留在各表中以AssociationDevList为例的残余信息. 如图所示拓扑结构中: 路由器1脱离网络后,通过协调器按键操作来  清除 协调 ...

  2. Java代码优化(长期更新)

    前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...

  3. SqlServer-无限递归树状图结构设计和查询

    在现实生活中,公司的部门设计会涉及到很多子部门,然后子部门下面又存在子部门,形成类似判断的树状结构,比如说评论楼中楼的评论树状图,职位管理的树状图结构等等,实现类似的树状图数据结构是在开发中经常出现的 ...

  4. HDU 5475(2015 ICPC上海站网络赛)--- An easy problem(线段树点修改)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5475 Problem Description One day, a useless calculato ...

  5. FFMpeg video duration

    1. 代码 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ...

  6. JavaScript实现通过的集合类

    集合是一种数据结构,用以表示非重复值的无序集合.集合的基础方法包括添加值.检测值是否在集合中,这种集合需要一种通用的实现,以保证操作效率. JavaScript的对象是属性名以及与之对应的值的基本集合 ...

  7. jQuery:详解jQuery中的事件(一)

    之前用过一些jQuery的动画和特效,但是用到的部分也不超过10%的样子,感觉好浪费啊——当然浪费的不是jQuery,而是Web资源.后来就想深入研究下jQuery的内部机理,读过两遍jQuery源代 ...

  8. Three.js基础部分学习

    一.关于使用Three.js几点理论说明 1.请参考官网地址 https://threejs.org/ 2.使用three.js必备条件 <场景 A scene.相机a camera.渲染器 a ...

  9. hibernate(3) —— 关系映射

    hibernate中关系映射指的是实体类与实体类间的关系.和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系. 一:一对一映射 两个对象之间是一对一的关系,如人和身份证之间是 ...

  10. SPF邮件伪造漏洞测试脚本

    测试脚本: # -*- coding: utf-8 -*- import socket,select,base64,os,re,time,datetime class mail: def __init ...