一.问题描述:

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. slam学习足迹

    1.slam入门介绍 2.齐次坐标系 3.贝叶斯滤波 均值:平均值 标准差:样本的集中程度/分散度 方差:标准差的平方 协方差:不同维度之间的关系(相关度) 协方差矩阵:多维度之间的关系(相关度) 4 ...

  2. 获取元素位置信息和所占空间大小(via:js&jquery)

    工作中有一个很常见的需求,hover或者click某元素后,在该元素旁边出现弹框,主要就是获取该元素的位置坐标以及元素所占区块的大小.最近工作中就遇到了,发现js和jquery的实现方法有很大的区别, ...

  3. 传输层:TCP 协议

    传输层:TCP 协议 一.概述 TCP 和 UDP 处在同一层——运输层,但是它们有很多的不同.TCP 是 TCP/IP 系列协议中最复杂的部分,它具有以下特点: (1) TCP 提供 可靠的 数据传 ...

  4. 后台CMS日志处理记录

    自从上一次添加了极光推送之后,我的工程就像是着魔了一样,不管怎么调整,日志级别都是DEBUG. 启动一次工程会打印很多无用日志,今天决定抽时间去研究了一下,最终解决了问题,下面记录一下解决过程. 1. ...

  5. Linux学习之十五-Linux文件特殊权限和附加权限

    Linux文件特殊权限和附加权限 1.特殊权限suid 范围:只能针对二进制命令文件 作用:让普通用户拥有二进制命令文件所有者的权限 举例1:普通用户使用passwd命令修改密码 cat /etc/s ...

  6. IntelliJ IDEA 识别一个类所属的jar包package

    IntelliJ IDEA 识别一个类所属的jar包package 按住ctrl,鼠标移动上去,不要点击: 有木有快捷键? ctrl+alt+B直接就过去了:需要再跳回来:

  7. Vue框架引入JS库的正确姿势

    参考自:https://mp.weixin.qq.com/s?src=3&timestamp=1527154113&ver=1&signature=tWGeTa86gyK*RL ...

  8. 【Python】字典~深入篇

    字典的定义 字典是一系列键值对,字典用放在{}一系列键值对表示 info = {','city':'KunMing'} 字典增.删.改.查 增加新元素 指定字典名,用方括号括起来的键和相关的值 inf ...

  9. 1M网速等于多少K

    http://zhidao.baidu.com/question/157400316.html&__bd_tkn__=65ac453b343794385019e962bfb06bb8c710d ...

  10. mysql 时间函数date_format

    http://toptree.iteye.com/blog/812642今天,在开发邮件系统的时候发现有很多的邮件没有发送成功,想手动把数据修改.找了mysql 的日期函数 获得的pubtime为St ...