zoukankan      html  css  js  c++  java
  • 20155219实践题目实现od命令

    实践题目

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

    od的功能:

    od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。
    选项-t:指定输出格式,格式包括a、c、d、f、o、u和x。
    参数x[SIZE]:十六进制,SIZE字节为单位以十六进制输出。
    od -tx XXX是以十六进制输出XXX的内容,默认以四字节为一组显示。(XXX中字符对应的ascii值的十六进制表示,且每四字节显示的顺序是字符从后向前的顺序)

    遇到的问题

    • 1.如何输出行号?

    通过观察发现,每行开头这串数字为八进制,数值为在本行之前的字符数。所以,只需在prinf()函数中格式化输出printf("%07o",参数)即可。

    • 2.发现程序无法显示“ ”的ASCII字符导致与od命令不完全相符?

    对读取的字符进行判断,如遇到“ ”,手动输出。要注意使用转义字符,即printf(" ")。对于最后一行的序号即为i的个数,是一个计数功能,其个数比字符数多1,因为将换行符也计入其中。
    但是仍出现如下错误,如图:

    想到一个方法:在每个字符输出之后做一个判断如果下一个字符输出是‘’,则手动输出‘ ’。但遇到如下错误,如图:

    仍在想解决办法。

    • 3.如何输出两行不同形式的字符

    在输出行号的同时使用一个for循环将刚刚输出的字符的ASCII码值再重新输出一遍。

    • 4.输出遇到如下问题,最后一行无法输出其ASCII码的值,如图:

    解决方法:在程序结尾处新加一个for循环,开头引入新的变量h,用于计数本行字符的个数。

    程序如下:

    #include <stdio.h>
    #define m 1000
    int main()
    {
      int i=0,j=0,g,h=0;
      char fileName[100];
      char str[m],temp[m];
      printf("od filename:");
      gets(fileName);
      FILE *in=fopen(fileName,"r");
      if (in==NULL)
      {
        printf("Error 404: Object not found!");
      }
      else
      {
    	printf("%07o",0);
            printf("  ");
        while(!feof(in))
         {
          fscanf(in,"%c",&str[i]);
          if (j%16==0&&j!=0)
          {
    	printf("
    ");
    	printf("        ");
            for(g=i-h;g<i;g++)
    	{
    		printf("%x  ",str[g]);
    	}
    	printf("
    ");
            printf("%07o",j);
    	printf("  ");
          }
            printf("%c   ",str[i]);
            i++;
    if(str[i+1]=='
    ')
    {printf("\n");}
            j++;
            h++;
    	if(h==17)
    h=1;
        }
    printf("  ");
      for(g=i-h;g<i;g++)
    	{
    		printf("%x  ",str[g]);
    	}
      }
      fclose(in);
    	printf("
    ");
    printf("%07o",i);
    printf("
    ");
      return 0;
    }
    

    最终截图:

  • 相关阅读:
    Windows命令行乱码问题解决
    Mysql中in语句排序
    MyBatis批量修改操作
    MyBatis联合查询association使用
    【转】Nginx 安装配置
    【转】解决编译安装NGINX时make报错
    【转】ora-00031:session marked for kill处理oracle中杀不掉的锁
    IOC-AOP
    【转】 linux之sed用法
    【转】Nginx+Tomcat+Memcached集群Session共享
  • 原文地址:https://www.cnblogs.com/paypay/p/7616765.html
Copyright © 2011-2022 走看看