zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155312 《信息安全系统设计基础》第四周学习总结

    2017-2018-1 20155312 《信息安全系统设计基础》第四周学习总结

    补充完成课上没有完成的myod

    • 编写完代码后发现编译出错(图5)“Myod和main被重复定义”。

    • 我想可能是因为通过命令行输入的文件名是“myod.c”导致的,所以创建了“t1.txt”,运行后编译结果如下图:(图6)

    • 这说明问题不在代码上,我开始从自己的编译命令上思考,恍悟自己误将命令行输入加到了编译环节里,正确做法是在运行可执行文件时输入文件名。(图7)

    • 运行后发现结果有错,十六进制打印时值均为“0”,于是再次从逻辑上开始寻找错误。在读取数据后添加测试代码,查看读取的内容是否正确:

    for(k=0;k<i;k++) 
        printf("%c ",record[k]);
    
    • 运行后结果如图(图8),发现读取文件内容的过程出错,读取的值都为空。通过检查代码发现出错的代码如下,分析错因有两个:1.目的是每次读入一个字节并存入数组record[]中,那么第二个参数应该是数组每个单元的地址;2.前后两个判断语句可能造成读入了两个字节,并没有起到双重判断的作用。
    while(read(fd,&record,1)!=0 && read(fd,&record,1)!=0 )
    
    
    • 修改后代码和运行结果如下所示:(图9)
    while(read(fd,&record[i],1)!=0 )
    

    • 运行后发现出现了两个问题:1.第一列的数字每次加32而非加8;2.十六进制值与字符位置不对应。经过分析代码发现是在记录行数时出现了问题,将行数i自加的指令从打印ascii值的循环中移动到后面打印字符的循环中后,运行结果如下:(图10)

    • 此时解决了第一行行号的错误,但是通过对比myod和系统命令“od -tx1 -tc myod.c”可以发现,打印时位置不对应的原因是在打印字符时换行符“ ”作为换行输出了。增加判断是否为换行符的代码

    if(record[i*16+j]=='
    ')
    {
      printf("\n  ");
    }
     else
    {
        printf(" %c  ",record[i*16+j]);
    }
    
    

    后运行结果如下:(图11)

    • 通过对比00260行可以发现,需要对制表符“ ”做同样的处理。通过对比发现最后结尾处myod打印了多余的ascii值“00 00 00 00 00 ”(图12)

    • 在循环控制条件中加了一条判断语句"i*16+j<n",最后结果正确,如图所示(图13)

     for(j=0;j<16 && i*16+j<n;j++)
    

    head,tail的使用

    • 通过运行“head myod.c”和“tail myod.c”可以发现,head、tail的作用分别是显示一个文件的前十行和后十行(图14)。

    • 使用命令“man -k head | grep 1”、“man -k tail | grep 1”查看帮助文档如下:(图15)

    man命令

    伪代码如下:

    命令行读入文件并存入数组
    while(从前向后遍历数组时换行符个数少于10个)
    do {
        打印一行的字符
        换行符个数自加
    }
    

    产品代码如下:

     1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <unistd.h>
      4 #include <sys/types.h>
      5 #include <sys/stat.h>
      6 #include <fcntl.h>
      7 #define BUFFERSIZE 4096
      8 void Myhead(char record[],int n)
      9 {
     10     int i=0,num=0,j;
     11     for(i=0;i<n&& num<10;i++)
     12     {
     13         if(record[i]=='
    ')
     14             num++;
     15         printf("%c",record[i]);
     16     }
     17 }
     18 int main(int argc,char** argv)
     19 {
     20     //struct utmp current_record;
     21     char record[BUFFERSIZE];
     22     int fd,m=0,j=0,k=0,i=0,flag=0;
     23     int relen=sizeof(record);
     24     if((fd = open(argv[1],O_RDONLY)) == -1)
     25     {
     26         perror( argv[1]);
     27         exit(1);
     28     }
     29     while(read(fd,&record[i],1)!=0 )
     30     {
     31         i++;//i表示读入的字符个数
    32     }
     33     //for(k=0;k<i;k++) printf("%c ",record[k]);
     34     Myhead(record,i);
     35     close(fd);
     36     return 0;
     37 }
    
    

    运行截图如下:(图16)

    tail命令

    伪代码如下:

    命令行读入文件并存入数组
    while(从后向前遍历数组时换行符个数少于10个)
    do {
        用变量记录当前数组下标
        换行符个数自加
    }
    用一个循环打印从变量对应的下标开始到文件结尾的所有字符
    

    产品代码如下:

     1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <unistd.h>
      4 #include <sys/types.h>
      5 #include <sys/stat.h>
      6 #include <fcntl.h>
      7 #define BUFFERSIZE 4096
      8 void Mytail(char record[],int n)
      9 {
     10     int i,num=0,j;
     11     for(i=n-1;i>=0,num<10;i--)
     12     {
     13         if(record[i]=='
    ')
     14             num++;
     15     }
     16     for(j=i-1;j<n;j++)
     17     {
     18         printf("%c",record[j]);
     19     }
     20 }
     21 int main(int argc,char** argv)
     22 {
     23     //struct utmp current_record;
     24     char record[BUFFERSIZE];
     25     int fd,m=0,j=0,k=0,i=0,flag=0;
     26     int relen=sizeof(record);
     27     if((fd = open(argv[1],O_RDONLY)) == -1)
     28     {
     29         perror( argv[1]);
     30         exit(1);
     31     }
     32     while(read(fd,&record[i],1)!=0 )
     33     {
     34         i++;//i表示读入的字符个数
     35     }
     36     //for(k=0;k<i;k++) printf("%c ",record[k]);
     37     Mytail(record,i);
     38     close(fd);
     39     return 0;
     40 }
    
    

    运行截图如下:(图17)

    20155312

  • 相关阅读:
    【重点】2020年宝山区义务教育阶段学校校区范围与招生计划(初中)
    转: 彻底理解 Spring 容器和应用上下文
    转《深入理解 Java 内存模型》读书笔记
    Mysql Update 流程摘抄
    统一支付接口设计
    支付系统 简版设计
    订单1:n支付单 设计讨论
    RocketMQ 使用情况梳理
    转 Java jar (SpringBoot Jar)转为win可执行的exe程序
    Git flow 工作流与规范
  • 原文地址:https://www.cnblogs.com/zjy1997/p/7674823.html
Copyright © 2011-2022 走看看