一.问题描述:

1 复习c文件处理内容

2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

3. main与其他分开,制作静态库和动态库

4. 编写Makefile

二.分析:

1.实质就是od命令的重写再加动态库和静态库的制作。

2.一提到命令重写,我能想到的就是带参数的main函数,然后就是详细了解od -tx -tc XXX这条命令实现的功能。

三.实验环境

4.3.0-kali1-amd64

四.详细过程

1.od -tx -tc XXX命令功能分析



上面这个图非常值得认真看一下,两条命令od -tc -tx testfileod -tc -tx1 testfile的不同。man od之后得到这样的结论,-x后面不加数字默认一次输出两个字节的十六进制,相当于-x2。然而这里却一次输出了四个字节,而且是倒序!(对比-x1可知)为此我特地去实验楼环境查看,结果一样!但当我运行od -tc -tx2 testfileod -tc -tx4 testfile时出现了这样的情况:

综上,我得出一个问题:到底是linux关于od命令的注释错了还是linux中一个字母占的不是一个字节?

2.分析完od -tx -tc XXX命令的功能得出的结论:XXX内容的ascii字符输出一次,以及每四个字符的十六进制倒序输出一次,每行十六个字符。OK!现在开始设计源代码。

//t头文件
#ifndef HEAD_H
#define HEAD_H
#include <stdlib.h>
#include <stdio.h>
FILE *fp;
char ch;
char a[16];
int num_A;
void GetChar();
void PrintHex(char ch);
void PrintAscii(char ch);
#endif

头文件中有一些全局变量以及函数声明

//单独定义的全局变量
#ifndef GLOBE_H
#define GLOBE_H int num;
char temp[4];
int k;
#endif

这里单独定义某些全局变量是因为如果把它们写进head.h会出现变量多重定义的错误。具体原因看下面代码就可明白。

//从文件中读取16个字符写进固定长度和数组
#include "head.h"
#include "globe.h"
void GetChar(){
while(!feof(fp) && (num < 16)){
a[num++] = fgetc(fp);
}
num = 0;
}

为什么要把数据写进数组?是因为-tc和-tx实际上要对数据输出两次,一次单独拿出来16个字符输出纯粹为了方便!

//以十六进制形式输出a数组中暂存的16个字符
#include "globe.h"
#include "head.h"
void PrintHex(char ch){
if(k > 0){
k--;
temp[k] = ch;
}
else{
for(;k < 4;k++)
printf("%x",temp[k]);
printf(" ");
num_A--;
}
}
//以ascii输出字符
#include "head.h"
void PrintAscii(char ch){
printf("%c ",ch);
}
//makefile
myod:main.o PrintHex.o PrintAscii.o GetChar.o
gcc -g *.o -o myod main.o:main.c head.h
gcc -c main.c
PrintHex.o:PrintHex.c globe.h head.h
gcc -c PrintHex.c
PrintAscii.o:PrintAscii.c head.h
gcc -c PrintAscii.c
GetChar.o:GetChar.c globe.h head.h
gcc -c GetChar.c

五.结果分析





没错,程序是有bug的。其实我调试了很长时间都没有找到问题!不明白为什么只有第一行输出格式不正确。由于时间原因,我只能带着问题输出实验结果,如果大家发现问题所在,望告知!同时,我自己也会调试。

六.总结

很长时间没有写代码,的确手生了很多,再加上在linux环境下也比较陌生,所以整整花了一下午时间才到达这种程度。其实这个程序还有很多改进的地方,比如修复bug;前面加上行数;命令选项扩展等。日后有时间我会把这些内容重新改进。

20179209课后作业之od命令重写的更多相关文章

  1. String字符串类课后作业

    String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...

  2. JAVA第三周课后作业

    JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main( ...

  3. java课后作业

    课后作业之字串加密: 设计思想: 1.输入要加密的英文子串str 2.定义num=str的字符串长度 3.将字符串转化为单个字符 4.每个字符+3,向后移3个 5.定义str1,将新得到的每个字符加到 ...

  4. linux之od命令

    od [OPTION]... [FILE]...  把文件用8进制或者其他的格式显示出来.通常用于查看特殊格式文件的内容.  这个命令默认把文件的内容用八进制的形式清晰地写在标准输出上.如果是多个文件 ...

  5. [转]Linux之od命令

    转自:http://os.51cto.com/art/200912/173136.htm 随着计算机飞速的发展,很多人开始学习Linux,怎样才能学好Linux,一定要学好Linux的命令.学习Lin ...

  6. linux下hexdump和od命令:显示文件十六进制格式

    Linux指令: od 示例用法:  od -c hello Linux指令:      od od命令用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进 ...

  7. linux od命令

    用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件.od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal Du ...

  8. MyOD-Linux od命令的实现

    MyOD 一.设计思路 确定MyOD的要求 根据需求可知MyOD需要实现类似Linux下 od -tx -tc XXX的功能,于是先去网上查找了一下od命令的-tx以及-tc参数的作用,经查找后了解到 ...

  9. python基础一之课后作业:编写登录接口

    1 # Author : Mamba 2 3 #python基础一之课后作业:编写登录接口 4 5 # 输入用户名密码 6 # 认证成功后显示欢迎信息 7 # 用户名3次输入错误后,退出程序 8 # ...

随机推荐

  1. Hadoop OutputFormat浅析

    问题:reduce输出时,如果不是推测任务写结果时会先写临时目录最后移动到输出目录吗? 下面部分转自Hadoop官网说明 OutputFormat 描述Map/Reduce作业的输出样式. Map/R ...

  2. luogu P1880 石子合并

    题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...

  3. 【Kafka】《Kafka权威指南》——分区partition

    在上篇的例子里([Kafka]<Kafka权威指南>--写数据), ProducerRecord 对象包含了目标主题.键和值. Kafka 的消息是 一个个 键值对, ProducerRe ...

  4. Android中的多线程断点续传

    Android多线程断点下载的代码流程解析: 运行效果图: 实现流程全解析: Step 1:创建一个用来记录线程下载信息的表 创建数据库表,于是乎我们创建一个数据库的管理器类,继承SQLiteOpen ...

  5. 模拟登陆web微信的流程和参数细节

    这几天在用python写了一个模拟登陆web微信,发送和接受信息的程序.发现步骤不多,但需要的参数太多了 整个过程中,务必保证session.headers.cookie一致,不然的话,中间会出现登陆 ...

  6. VS2010 MFC中 使用CListCtrl的排序功能

    list 控件是creat的,不是拖在对话框上的.想使用CListCtrl的排序功能却犯了愁~~~ 还好找到方法,如下: .h文件里:afx_msg void OnLvnColumnclickList ...

  7. setOnFocusChangeListener的使用

    类似于文本框里面hint文字在初始化的时候显示或者隐藏的操作,就要用到setOnFocusChangeListener的 首先我认为不是太必要- 毕竟当你输入东西时,默认文字自然会消失 当然假设你执意 ...

  8. 如何选择Haproxy和Nginx

    对于做软负载,我们都知道主流的方案有LVS.Haproxy.Nginx!那么对于Haproxy和Nginx,我们如何选择呢?回答这个问题之前,我根据个人使用经验来讲下它们的特点! Haproxy特点 ...

  9. 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】

    转:http://blog.csdn.net/linxingliang/article/details/52069503 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求 ...

  10. Spring2.5学习3.2_编码剖析@Resource注解的实现原理

    首先看一下J2EE提供的@Resource注解:该注解默认安照名称进行装配,名称能够通过name属性进行指定, 假设没有指定name属性,当注解写在字段上时,默认取字段名进行依照名称查找,假设注解写在 ...