实践题目

编写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.发现程序无法显示“\n”的ASCII字符导致与od命令不完全相符?

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

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

仍在想解决办法。

  • 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("\n");
	printf("        ");
        for(g=i-h;g<i;g++)
	{
		printf("%x  ",str[g]);
	}
	printf("\n");
        printf("%07o",j);
	printf("  ");
      }
        printf("%c   ",str[i]);
        i++;
if(str[i+1]=='\n')
{printf("\\n");}
        j++;
        h++;
	if(h==17)
h=1;
    }
printf("  ");
  for(g=i-h;g<i;g++)
	{
		printf("%x  ",str[g]);
	}
  }
  fclose(in);
	printf("\n");
printf("%07o",i);
printf("\n");
  return 0;
}

最终截图: