一、题目要求

  • 1、复习c文件处理内容

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

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

    4、编写Makefile

    5、提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

    6、在博客园发表一篇博客,重点写遇到的问题和解决过程

二、od命令

od命令

用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

语法:od [<选项><参数>] [<文件名>]

命令中各选项的含义:

  • A 指定地址基数,包括:

    d 十进制

    o 八进制(系统默认值)

    x 十六进制

    n 不打印位移值

  • t 指定数据的显示格式,主要的参数有:

    c ASCII字符或反斜杠序列

    d 有符号十进制数

    f 浮点数

    o 八进制(系统默认值为02)

    u 无符号十进制数

    x 十六进制数

    除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数。

说明:od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal

Dump)。但这不是最有用的显示方式,用ASCII码和十六进制组合的方式能提供更有价值的信息输出。

其中本次作业中需要实现的是:

-tc:输出ASCII字符及反斜杠序列(如\n)

-tx:输出十六进制数

实现指令:myod -tc -tx XXX.txt

三、实现过程

设计思路:

要实现的od -tc -tx1 XXX命令,-tc表示输出ASCII字符,-tx1表示以十六进制输出,每组输出一字节。

利用printf函数的输出控制字符串的控制代码,可以方便输出字符变量的ASCII值。

通过控制转换说明符来规定输出形式。

1)myod.c文件

用于打开测试的txt文件

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main(int argv,char *argc[]){

FILE *fp;

fp=fopen(argc[1],"rb");

if(fp==NULL){

printf("Failure to open file\n");

return 0;

}

char ch;

char STR[1000];

int i,n;

i=0;

while((ch=fgetc(fp))!=EOF){

STR[i]=ch;

i++;

}

STR[i]='\0';

fclose(fp);

od(STR,i);

}

2)od.c文件

调用od.c实现od -tc -tx功能

#include "head.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void od(char STR[1000], int i)

{

int k = 1;

int j = 0;

int line = 0;

printf("%06d ", line);

putchar(STR[0]);

for (k = 1; k <= i; k++)

{

if (k % 16 != 0 && STR[k] != '\0')

{

if (STR[k] != '\n')

{

printf(" %2c", STR[k]);

continue;

}

else

{

printf(" \\n");

continue;

}

}

else

{

printf("\n ");

for (j = m; j < k; j++)

{

printf(" %02x", STR[j]);

}

printf("\n%06d", k + 2);

m = k;

}

}

printf("\n");

}

3)头文件head.h

#ifndef HEAD_H

#define HEAD_H

void od(char STR[],int);

#endif

4)结果测试:

Txt文件内容:

Curry_mvp 20191223zjy

程序运行结果:

四、静态库和动态库的创建与实现

静态库:

参照教材39页的内容

动态库:

五、makefile实现

Makefile内容:

结果如图:

六、遇到的问题

  • 1、新建的makefile文本文件不能执行

    解决:makefile不能有后缀名

  • 2、生成链接库文件后,输入文本文件的名称显示not find

    解决:需将文本文件和源代码放置同一个文件夹下,否则应加上路径

  • 3、优先加载问题

    GCC在链接过程中,对参数中的库的顺序是有要求的,参数右侧的库会先于左侧的库加载,也就是说参数的解析是从右往左的。

    假设库B依赖与库A,则链接的时候要写为:

    gcc -o bin B A

    如果写为:

    gcc -o bin A B

    则在B中引用的A中的内容就会无法链接通过

    如果在同一目录下,既有静态库又有动态库,则在默认情况下是先加载动态库,因为对gcc来说默认方式是加载动态库,如果要让静态库优先加载的话,则需要加上-static参数

最新文章

  1. ASP.NET Aries 2.0 发布(原来的源码SVN已关闭,开源源码已迁移到GitHub)
  2. xamarin绑定原生库的一些坑
  3. WebGIS开源方案中空间数据的入库、编辑、发布的操作流程
  4. inpyt 按钮变透明 边框
  5. javascript document.compatMode属性
  6. js零散总结
  7. $.getJSON异步请求和同步请求
  8. paper 3:matlab中save,load使用方法小结
  9. easyui知识累计.递增.
  10. Java for selenium(webdriver) 环境搭建
  11. linux文件解-压缩
  12. C/C++语言的标准库函数malloc/free与运算符new/delete的区别
  13. C#的数据类型总结(2):decimal ,double,float的区别
  14. 【一天一道LeetCode】#350. Intersection of Two Arrays II
  15. java并发容器(Map、List、BlockingQueue)
  16. 吐血总结|史上最全的MySQL学习资料!!
  17. java面试题复习(三)
  18. 两数之和,两数相加(leetcode)
  19. django中将model转换为dict的方法
  20. 【技术分享会】 iOS开发简述

热门文章

  1. POJ3061——Subsequence(尺取法)
  2. c++ if语句讲解&amp;例题
  3. TP6自带的跨域中间件无法使用的个人解决方法
  4. 限制只有VIP会员才能下载Ecshop文章页的附件
  5. Java基础系列(20)- while循环
  6. javascript 函数节流 throttle 解决函数被频繁调用、浏览器卡顿的问题
  7. nginx与mysql安装
  8. P4357-[CQOI2016]K远点对【K-Dtree】
  9. vue 移动端项目切换页面,页面置顶
  10. mysql从零开始之MySQL 创建数据库