20191302MyOD

MyOD编程

任务要求

  1. 复习c文件处理内容

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

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

  4. 编写Makefile

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

c文件处理内容复习

od命令详解

  • od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来。

  • od命令格式
    od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]

  • 参数:

    -a  此参数的效果和同时指定"-ta"参数相同。
    -A<字码基数>  选择要以何种基数计算字码。
    -b  此参数的效果和同时指定"-toC"参数相同。
    -c  此参数的效果和同时指定"-tC"参数相同。
    -d  此参数的效果和同时指定"-tu2"参数相同。
    -f  此参数的效果和同时指定"-tfF"参数相同。
    -h  此参数的效果和同时指定"-tx2"参数相同。
    -i  此参数的效果和同时指定"-td2"参数相同。
    -j<字符数目>或--skip-bytes=<字符数目>  略过设置的字符数目。
    -l  此参数的效果和同时指定"-td4"参数相同。
    -N<字符数目>或--read-bytes=<字符数目>  到设置的字符数目为止。
    -o  此参数的效果和同时指定"-to2"参数相同。
    -s<字符串字符数>或--strings=<字符串字符数>  只显示符合指定的字符数目的字符串。
    -t<输出格式>或--format=<输出格式>  设置输出格式。
    -v或--output-duplicates  输出时不省略重复的数据。
    -w<每列字符数>或--width=<每列字符数>  设置每列的最大字符数。
    -x  此参数的效果和同时指定"-h"参数相同。
    --help  在线帮助。
    --version  显示版本信息。

  • openeuler下测试od命令:

C语言实现MyOD

main.c

#include "myodhead.h"
#include<stdio.h>
#include<stdlib.h>

int main(char argv[])
{
    FILE *fp;
    char args[N],name[N],ch;
    int i=0;
    printf("please input file name:");
    scanf("%s",name);
    if((fp=fopen(name,"r"))==NULL){
        printf("ERROR!");
        exit(0);
    }
    while(fgets(args,M,fp)){
        tx(args,i++);
        tc(args);
    }
    fclose(fp);
 }

tc.c

#include "myodhead.h"
#include <stdio.h>
void tc(char args[]){
    int i;
    printf("      ");
    for(i=0;args[i]!='';i++)
    {
        if(args[i]=='
')
           printf("\n");
        else
           printf("%4c",args[i]);
    }
   printf("
");
}

tx.c

#include "myodhead.h"
#include<stdio.h>
void tx(char args[],int j)
{
    int i;
    char output[N];
    printf("%07o",16*j);
    j++;
    for(i=0;args[i]!='';i++)
    {
        if(args[i]=='
')
            output[i]='
';
        else
            output[i]=args[i];
    }

    for(i=0;args[i]!='';i=i+4)
    {
        printf("        %x%x%x%x",output[i+3],output[i+2],output[i+1],output[i]);
    }
    printf("
");
}

myodhead.h

#ifndef __MYODHEAD_H__
#define __MYODHEAD_H__
#define N 999
#define M 17

void tc(char args[]);
void tx(char args[],int j);

#endif

编译运行

  • 编译
    gcc -Iinclude -c src/tx.c -o lib/tx.o
    gcc -Iinclude -c src/tc.c -o lib/tc.o
  • 运行
    gcc lib/*.o -Iinclude -o bin/myod
    • ./bin/myod

静态库制作

  • gcc -c -Iinclude src/tc.c src/tc.c -Llib
    ar crv lib/libmyod.a lib/*.o

动态库制作

  • gcc -fPIC -shared -o lib/libmyod.so -Iinclude src/*.c

makefile制作

  • Makefile

gdb调试

问题及解决

  • 问题:在编译时报错
  • 解决:出现问题的原因是我将N作为全局变量放在了myodhead.h中,但未在tx.c中加入#include "myodhead.h",加上后问题解决
  • 问题:在运行时显示内容与od命令有差距
  • 解决:第一列并不表示文本,所以需要空出来,于是我在main.c文件中,在打印每行前,加入printf(" "),进行补充,结果显示正常
原文地址:https://www.cnblogs.com/dongjiashuai/p/15334770.html