第一题
题目要求
- 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号
- 用Vi输入图中代码,并用gcc编译通过
- 在Vi中使用K查找printf的帮助文档
- 提交vi编辑过程截图,要全屏,包含自己的学号信息
题目截图:
第二题
题目要求
- 用gcc 进行预处理,编译,汇编,链接vi输入的代码
- 生成的可执行文件中要有自己的学号
- 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
题目截图:
第三题
题目要求
- 用gcc -g编译vi输入的代码
- 在main函数中设置一个行断点
- 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
- 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
题目截图:
第四题
题目要求
- 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
- 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
题目截图:
第五题
题目要求
- 除了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;
}
最终截图: