第一题

题目要求

  • 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
  • 用Vi输入图中代码,并用gcc编译通过
  • 在Vi中使用K查找printf的帮助文档
  • 提交vi编辑过程截图,要全屏,包含自己的学号信息
    image

题目截图:

image

第二题

题目要求

  • 用gcc 进行预处理,编译,汇编,链接vi输入的代码
  • 生成的可执行文件中要有自己的学号
  • 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息

题目截图:

image

第三题

题目要求

  • 用gcc -g编译vi输入的代码
  • 在main函数中设置一个行断点
  • 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
  • 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

题目截图:

image
imageimage

第四题

题目要求

  • 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
  • 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

题目截图:

imageimage

第五题

题目要求

  • 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
  • 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

题目截图:

第六题

题目要求

  • 1.写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath,只用显式规则就可以
  • 2.提交Make过程截图,要全屏,包含自己的学号信息

Makefile 基本规则

1、打开的gvim环境中输入i进入编辑模式,输入代码,保存为prog.c、 code.c、 code.h文件

2、输入vim Makefile,输入i进入编辑模式,输入代码并保存

3、输入make,进行自动化编译

4、执行./test查看结果

题目截图:

其中makefile中的内容为:

testmymath: main.o add.o sub.o mul.o div.o

gcc main.o add.o sub.o mul.o div.o -o testmymath

main.o: main.c head.h

gcc -c main.c

因为我的四个加减乘除文件已经编译。所以其中不用再编译一次。

过程中遇到了如下问题:

missing separator stop

通过百度得到答案
:原因是tab格式错误导致 所在的行必须以tab开头。

实践题目

编写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>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define m 1000
#define BUFFERSIZE 4096
void Myod(char record[],int n)
{
	int i=0,k,j;
	
	for(k=0;k<n;k++)
	{
		if(k%16==0 && k!=n-1)
		{
			printf("%07o  ",k);
			for(j=0;j<16 && i*16+j<n;j++)
			{
				printf("%02x  ",record[i*16+j]);
			}
			printf("\n");
			//i表示行数
		}
		else  
		{
			printf("         ");
			for(j=0;j<16 && k!=n-1;j++)
			{
				if(record[i*16+j]=='\n')
			    {
	                 printf("\\n  ");
				}
				else if(record[i*16+j]=='\t')
				{
					printf("\\t  ");
				}
   	            else
 				{
					printf(" %c  ",record[i*16+j]);

				}   
			    k=i*16+j;
			}
			i++;
			printf("\n");
			if(k==n-1)
			{
				printf("%07o  \n",n);
			}
			
		}
	}
}
int main(int argc,char** argv)
{
	//struct utmp current_record;
	char record[BUFFERSIZE];
	int fd,m=0,j=0,k=0,i=0,flag=0;
	int relen=sizeof(record);
	if((fd = open(argv[1],O_RDONLY)) == -1)
	{
		perror( argv[1]);
		exit(1);
	}
	while(read(fd,&record[i],1)!=0 )
	{
		i++;//i表示读入的字符个数
	}
	//for(k=0;k<i;k++) printf("%c ",record[k]);
	Myod(record,i);
	close(fd);
	return 0;
}

最终截图:

码云链接!