程序效果:

  只实现了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. 离线安装swashbuckle(webapi自动文档及测试工具)

    1.找到已经成功安装过的项目根目录的packages文件夹拷贝到新的项目的根目录 2.vs设置nuget程序包源 将源:地址改为新项目的packages文件夹 3.重新编译并修改代码 右键项目-> ...

  2. asp.net教程:编译错误同时存在于不同dll中

    asp.net 编译错误类型“同时存在于”不同的dll中. 出现这种错误大概有三种情况: 1.ASPX页面,一个*.ASPX,对应着一个*.cs文件,两者其实是一个文件,通过两者实现代码分离,每个*. ...

  3. 向 div 元素添加圆角边框:

    div { border:2px solid; border-radius:25px; }

  4. thinkphp验证码

    thinkphp自带验证码 前端页面: <div style="position:absolute;z-index:3;top:160px;left:180px;"> ...

  5. css实现小三角(原理)

    效果图如图1所示:(简单示范,有点丑,莫介意) PS:兼容IE,FF , chrome ,360安全浏览器 先讲下原理吧,如图2所示: 这个div的样式如下所示: div{ width: 0px; h ...

  6. 第 31 章 项目实战-PC 端固定布局[4]

    学习要点: 1.热门旅游区 2.标题介绍区 3.旅游项目区 主讲教师:李炎恢 本章主要开始使用学习用 HTML5 和 CSS3 来构建 Web 页面,第一个项目采用 PC 端固定布局来实现. 一.热门 ...

  7. 云巴:基于MQTT协议的实时通信编程模型

    概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异, ...

  8. ABP中使用Redis Cache(2)

    上一篇讲解了如何在ABP中使用Redis Cache,虽然能够正常的访问Redis,但是Redis里的信息无法同步更新.本文将讲解如何实现Redis Cache与实体同步更新.要实现数据的同步更新,我 ...

  9. MongoDB分片(sharding)

    1.概念 分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存 ...

  10. org.springframework.context.ApplicationContextAware使用理解

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...