• 2017-2018-1 20155225 《信息安全系统设计基础》第2周课堂实验


    2017-2018-1 20155225 《信息安全系统设计基础》第2周课堂实验

    1. ifndef的用法

    作用:防止头文件被重复包含。最好将头文件的内容都放在#ifndef和#endif中。格式:

    #ifndef <标识x>//测试x是否被宏定义过
    #define <标识x>//如果没有宏定义,就宏定义x并编译下面的语句
     ......
    #endif//如果已经定义了则编译#endif后面的语句
    

    标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线。

    1. 在Vi中使用K查找帮助文档

    我们使用vim编辑shell脚本或者c/c++文件时,我们可能需要查找某个命令或者函数的手册,最简单的方法是:将光标移动到需要查找帮助的关键字上,按下
    K

    vim会对光标所在的单词执行"man"程序,找到就显示,用的是默认分页程序来处理上下滚动,到达帮助内容底部时按会回到vim.

    这是我在vim中使用K查找printf的帮助文档:

    image

    1. 生成并调用静态库

    ar命令——创建静态库.a文件,命令格式如下:

    ar rcs  libxxx.a xx1.o xx2.o
    

    参数r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。

    参数c:创建一个库。不管库是否存在,都将创建。

    参数s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)

    如图所示,新产生了mymath.a文件。

    image

    再编译、链接main.o和mymath.a,生成可执行文件

    gcc -static -o 5225 main.o ./mymath.a
    

    如图所示产生了可执行文件5225(绿色):

    image

    1. 生成和调用动态库
    gcc -shared -fpic -o libmymath.so add.c div.c mul.c sub.c
    

    注意:生成静态库的时候是将.o文件生成.a文件,动态库是直接将.c生成.so。

    image

    再将这个库链接到程序中即可。

    gcc -o 5225_2 main.c libmymaht.so
    

    image

    5.用显示规则写Makefile。

    之前不知道什么是makefile,找了几篇博客学习了一下,有个大概了解吧:

    其实上课做实验的时候就发现了这个问题:程序调试的时候,我发现了main.c写错了,然后我改了main.c,再编译链接却发现运行还是原来main.c的结果,原来我用的是原main.c生成的main.o来链接的,于是我只能删了原main.o重新编译一个mian.o。当时感觉这个问题很烦人!没想到有makefile就是帮我解决这个问题的!

    makefile的作用就是自动编译,格式如下:

     target... : prerequisites ...
    
     command
    

    target也就是一个目标文件,可以是Object File,也可以是执行文件。

    prerequisites是生成那个target所需要的文件或是目标。

    command也就是make需要执行的命令。(任意的Shell命令)

    这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

    对于我们这个程序有五个C文件,一个头文件。我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:

    1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

    2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。

    3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

    我写的Makefile如下(还带有clean命令):

    image

    对Makefile测试如下:

    这是用make命令,第一次编译,生成了可执行calculator,运行发现是为了固定了a,b的计算器。

    image

    然后打开main.c修改之后,再用make编译,发现自动先编译了main.c,再进行的链接。再运行就直接是获得用户输入的计算器了。

    image

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

    在linux里od -tx1 -tc XXX 的功能:按指定格式输出文件内容,-tx1表示以十六进制、一个字节为一组显示。-tc表示显示ASCII字符或者反斜杠。效果如图所示:

    image

    重新学习了C语言文件处理,但在linux里写C程序还是稍有不同,首先是文件名通过命令行参数传过去的,这个怎么弄?参考了Linux 程序设计学习笔记----命令行参数处理 ,解决了这个问题。

    写好程序后,发现文件读出来是这种样子???为什么文件后面有一段fffff的乱码?为什么我设置的16个字节换行,在第二行就不行了?

    image

    经过我反复调试和修改,发现之所以后面有一段乱码是因为我设置为16个字符为一次循环,如果最后一行不满16个就会输出乱码,需要在最后设计一个标记,循环到标记处就break。
    针对第二行提前换行的情况,我直接分开用两个循环,解决了这个问题。最终结果如下:

    image

    参考资料

  • 相关阅读:
    javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)
    javascript数据结构与算法---检索算法(二分查找法、计算重复次数)
    javascript数据结构与算法---检索算法(顺序查找、最大最小值、自组织查询)
    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)
    ThinkPHP5中Session的使用
    能让你少写1000行代码的20个正则表达式
    composer 安装
    thinkphp5.0 实现图片验证效果且能点击图片刷新图片
    thinkphp5.0 实现单文件上传功能
    thinkphp5.0 输入变量
  • 原文地址:https://www.cnblogs.com/clever-universe/p/7610195.html
Copyright © 2020-2023  润新知