程序效果:

  只实现了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. oracle触发器详解

    触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 1.触发器类型 触发器在数据库里以独立的对象存储,它与存储过程和 ...

  2. Java异常处理机制 try-catch-finally 剖析

    Java拥有着强大的异常处理机制,最近初步学习了下,感觉内容还是挺多的,特此来将自己的理解写出来与大家分享. 一. 在Java代码code中,由于使用Myeclipse IDE,可以自动提醒用户哪里有 ...

  3. <%@ page contentType="text/html; charset=utf-8" language="java"%>每一个字符的含义

    contentType="text/html:网页类型htmlcharset=utf-8"网页编码类型language="java"网页编程语言<% @ ...

  4. 2个很有趣、耐思考的C语言算法

    1. 输入10个整数,任意相邻的两个数不同,输出所有的递增,递减序列 比如: 输入:1 5 9 8 12 21 3 0 -1 9 输出: 1 5 9 9 8 8 12 21 21 3 0 -1 -1 ...

  5. UDS(ISO14229-2006) 汉译(No.5 公共约定)

    ISO 14229遵循OSI Service Conventions(ISO 10731)(OSI服务公约)所述,并应用于诊断服务.这些约定指定相互作用与服务消费者和服务提供者.通过服务原语,信息数据 ...

  6. 【工匠大道】svn使用总结

    原文地址 SVN(Subversion)是一个自由.开源的项目源代码版本控制工具.目前,绝大多数开源软件和企业代码管理,都使用SVN作为代码版本管理软件. Subversion将文件存放在中心版本库里 ...

  7. HashTable(散列表)

    最近都在研究数据结构,关于hashtable,或者叫做散列表,过去一直不了解是什么东西,现在终于明白了. 所谓hashtable,就是某组key,通过某个关系(函数),得到一个与之对应的映射值(在计算 ...

  8. 24、ASP.NET MVC入门到精通——数据库仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用. 1.在IDAL项目中,新建IDB ...

  9. MYSQL进阶,新手变司机

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...

  10. PowerDesigner 逆向工程 Mariadb 失败

    作者环境是win8.1 64位置 PowerDesigner 15, Mariadb 10+,在逆向的过程中发生错误,导致只能逆向出表对象,但是表对象中的字段信息确实没有的. 错误信息中的一部分是:  ...