20179209课后作业之od命令重写
一.问题描述:
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 testfile与od -tc -tx1 testfile的不同。man od之后得到这样的结论,-x后面不加数字默认一次输出两个字节的十六进制,相当于-x2。然而这里却一次输出了四个字节,而且是倒序!(对比-x1可知)为此我特地去实验楼环境查看,结果一样!但当我运行od -tc -tx2 testfile与od -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命令重写的更多相关文章
- String字符串类课后作业
String动手动脑和课后作业 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 结果: 总结:在Java中,内容相同的字串常量(&quo ...
- JAVA第三周课后作业
JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main( ...
- java课后作业
课后作业之字串加密: 设计思想: 1.输入要加密的英文子串str 2.定义num=str的字符串长度 3.将字符串转化为单个字符 4.每个字符+3,向后移3个 5.定义str1,将新得到的每个字符加到 ...
- linux之od命令
od [OPTION]... [FILE]... 把文件用8进制或者其他的格式显示出来.通常用于查看特殊格式文件的内容. 这个命令默认把文件的内容用八进制的形式清晰地写在标准输出上.如果是多个文件 ...
- [转]Linux之od命令
转自:http://os.51cto.com/art/200912/173136.htm 随着计算机飞速的发展,很多人开始学习Linux,怎样才能学好Linux,一定要学好Linux的命令.学习Lin ...
- linux下hexdump和od命令:显示文件十六进制格式
Linux指令: od 示例用法: od -c hello Linux指令: od od命令用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进 ...
- linux od命令
用户通常使用od命令查看特殊格式的文件内容.通过指定该命令的不同选项可以以十进制.八进制.十六进制和ASCII码来显示文件.od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal Du ...
- MyOD-Linux od命令的实现
MyOD 一.设计思路 确定MyOD的要求 根据需求可知MyOD需要实现类似Linux下 od -tx -tc XXX的功能,于是先去网上查找了一下od命令的-tx以及-tc参数的作用,经查找后了解到 ...
- python基础一之课后作业:编写登录接口
1 # Author : Mamba 2 3 #python基础一之课后作业:编写登录接口 4 5 # 输入用户名密码 6 # 认证成功后显示欢迎信息 7 # 用户名3次输入错误后,退出程序 8 # ...
随机推荐
- Elasticsearch搜索结果返回不一致问题
一.背景 这周在使用Elasticsearch搜索的时候遇到一个,对于同一个搜索请求,会出现top50返回结果和排序不一致的问题.那么为什么会出现这样的问题? 后来通过百度和google,发现这是因为 ...
- js 面试的坑:变量提升
全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. ...
- linux基础学习7
Linux 的开机流程分析 1. 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 2. 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 gr ...
- Beginning Auto Layout Tutorial in iOS 7: Part 2
Auto Layout to the rescue! 接下来就看看如何使用Auto Layout来实现这个效果. 首先移除viewWillLayoutSubviews方法,选择Main.storybo ...
- 【Maven】3.使用IntelliJ IDEA 使用本地搭建的maven私服,而不是使用默认的maven设置
安装Idea的教程:http://www.cnblogs.com/sxdcgaq8080/p/7641379.html 搭建maven私服的教程:http://www.cnblogs.com/sxdc ...
- 【spring boot logback】日志logback格式解析
日志logback格式解析 logback官网 格式解析 https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout 官网格式解析有 ...
- Object-C 类
Classes 类 像其它的面向对象的语言一样,Object-C也提供创建对象的蓝本.即类. 首先我们在类中定义一些能够反复使用的属性和方法. 然后,我们实例化类,即对象,之后就能够使用属性和訪问. ...
- SilverLight.3-Validation:二、银光验证。TheLabel、TheDescriptionViewer和TheValidationSummary
ylbtech-SilverLight.3-DataControls_BetterDataFroms:二.银光验证.TheLabel.TheDescriptionViewer和TheValidatio ...
- linux远程登录工具
ssh协议原理
- Importance sampling
用蒙特卡洛求解积分时 (Monte Carlo 随机采样对目标积分函数做近似) importance sampling func p(x) p(x)值大的地方,Monte Carlo多采几次 值小的地 ...