编写自己的shell解析器(一)一个简单的循环命令输入和历史打印
来源:互联网 发布:如何设置电子狗数据 编辑:程序博客网 时间:2024/04/29 16:36
这是整个代码的第一部分。
代码很短,结构很简单。用到的数据结构就是一个循环数组来存储输入的命令。
命令历史记录最多为12个。
问题分析和解决部分没有引用完整函数实现即声明,可能会影响阅读。具体代码见本博客最下。
我的分析:
//命令输入/* 需要保证 1.访问字符串中任意位置 2.可以分割字符串 并 进行存储 3.能够查看之前命令 实现 1.用char* 类型存储 2.循环数组存储12个命令 */
这里我简单介绍下遇到的问题和解决方法。
问题一
问题_1_1
很快代码便写好了,我的存储输入命令的字符串声明为:char *input_order,循环数组中存储命令的字符串数组声明为:char *the_order[12];
第一次编译,发现打印出的历史记录,所有的命令都是同一个。如,我第一次命令输入为:aaa,第二次为:bbb,输出的历史记录两次均为bbb。
查找原因_1_1
debug下发现,当input_order值改变时,命令 the_order的值立刻改变。
经过筛查,是为了达到封装性,把input_order的值到函数cin_INPUT_ORDER_to_HISTORYY中,赋值给the_order时,使用的是直接赋值:the_order = input_order。the_order中存储的是input_order的地址。这解释了为什么input_order变化时,the_input随之改变。
解决_1_1
于是我把赋值语句改成:strcpy(the_input,order_input)的形式,编译,运行。
问题1_2
这时。。发现竟然莫名其妙卡在order_input输入函数:scanf(“%s”,input_order)上。debug下显示不发访问input_order。加上取址运算符后,可以跳过这个步骤,但是input_order的值为空。
查找原因_1_2
经过分析,发现声明时(见最下面main函数)没有为指针变量赋初值,所以无法访问。
其实我很好奇之前是怎么成功的。。。
解决_1_2
把字符串声明为数组形式:char input_order[100],char the_order[12][100],编译运行成功。
具体输入代码见下
//命令 历史记录 循环队列typedef struct ORDER_HISTORY{ int in; int out; char the_order[NUM_OF_ORDER][100];}ORDER_HISTORY;//将 新输入命令 加入 历史记录 循环队列void cin_INPUT_ORDER_to_HISTORYY(ORDER_HISTORY *o1,char *s){ //ORDER_HISTORY o = *(ORDER_HISTORY*)o1; strcpy(o1->the_order[o1->in],s); o1->in=(o1->in+1)%NUM_OF_ORDER; o1->out = o1->in;}
问题二
问题_2_1
打印历史记录,当输入的命令总数不到12个时,会打印出空白。
查找原因_2_1
for循环打印时没有考虑这个问题
解决_2_1
我本来想是不是可以用sizeof或strlen得到the_order数组的大小,然后小于12个时,判断一下。但是最终我创建了一个变量来存储用来判断输入的命令够不够12个。
具体代码见下
//输出 命令 历史记录void print_ORDER_HISTORY(ORDER_HISTORY o,int t){ int i=0; int temp = 0; i = (o.in-1)%NUM_OF_ORDER; temp = t; if(t!=12) { while(t--) { i = (i+12)%NUM_OF_ORDER; printf("%s\n",o.the_order[i]); --i; } } else { for(;i!=o.out;--i) { i = (i+12)%NUM_OF_ORDER; printf("%s\n",o.the_order[i]); } }}
其他相关代码
#include<stdio.h>#include<math.h>#include <stdio.h>#include <string.h>const int NUM_OF_ORDER = 12;//命令 历史记录 循环队列typedef struct ORDER_HISTORY{ int in; int out; char the_order[NUM_OF_ORDER][100];}ORDER_HISTORY;int main(int argc, const char * argv[]) { ORDER_HISTORY order_history; //初始化 命令历史存储 int temp_count_order = 0;//存储数目 order_history.in = 0; order_history.out = 0; memset(order_history.the_order, '\0', 1200); char input_order[100] = "exit"; //存储输入命令 //输入指令 printf("%s","ysh>"); scanf("%s",input_order); temp_count_order++; cin_INPUT_ORDER_to_HISTORYY((ORDER_HISTORY*)&order_history,input_order); //循环输入指令 while(strcmp(input_order, "exit")) { printf("%s","ysh>"); scanf("%s",input_order); if(temp_count_order!=12) temp_count_order++; cin_INPUT_ORDER_to_HISTORYY((ORDER_HISTORY*)&order_history,input_order); } //print_ORDER_HISTORY(order_history,temp_count_order); return 0;}
资源下载:
ysh包括 cd ls那些呀 jobs 前台后台ctrl+挂起呀 各个方向的管道呀。。之类的
点我下载 并给作者送点积分:D
- 编写自己的shell解析器(一)一个简单的循环命令输入和历史打印
- 编写简单的shell命令解析器
- 编写简单的shell命令解析器
- 自己编写简单的shell
- 自己编写的简单shell
- 编写一个简单的shell
- 编写一个简单的shell
- unix shell 的历史命令和历史替代
- 自己编写的一个简单的计算器
- 编写自己的json解析工具一
- Linux 编写一个简单的Shell脚本
- 【linux】编写一个简单的shell
- 编写简单的网络版shell命令解释器
- 编写一个自己的Servlet(一)
- 编写一个程序,打印输入中单词长度的水平和垂直方向直方图
- 编写一个程序,打印输入中单词长度的直方图
- 编写一个程序,打印输入中单词长度的直方图
- CLisp 3:简单的输入和打印
- 关于Java窗口响应事件 windowsDeactivated
- shell
- Maxscript面向对象编程技术之封装与继承
- ddd
- 黑马程序员——Set集合概述及特点
- 编写自己的shell解析器(一)一个简单的循环命令输入和历史打印
- 队列
- ggplot2 1.1 图层属性(查询表)
- 数据类型(基本+高级)
- URAL1091 Tmutarakan Exams
- Java四种引用
- linux系统调用函数心得:fork()
- Xcode更新之后,插件不能用-解决办法
- google closure library