2017-2018-1 20155312 《信息安全系統設計基礎》第四周學習總結

2017-2018-1 20155312 《信息安全系統設計基礎》第四周學習總結

補充完成課上沒有完成的myod

  • 編寫完代碼後發現編譯出錯(圖5)「Myod和main被重複定義」。
    java

  • 我想多是由於經過命令行輸入的文件名是「myod.c」致使的,因此建立了「t1.txt」,運行後編譯結果以下圖:(圖6)
    git

  • 這說明問題不在代碼上,我開始從本身的編譯命令上思考,恍悟本身誤將命令行輸入加到了編譯環節裏,正確作法是在運行可執行文件時輸入文件名。(圖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」能夠發現,打印時位置不對應的緣由是在打印字符時換行符「\n」做爲換行輸出了。增長判斷是否爲換行符的代碼學習

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

後運行結果以下:(圖11)測試

  • 經過對比00260行能夠發現,須要對製表符「\t」作一樣的處理。經過對比發現最後結尾處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)。
    3d

  • 使用命令「man -k head | grep 1」、「man -k tail | grep 1」查看幫助文檔以下:(圖15)
    code

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]=='\n')
 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]=='\n')
 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

相關文章
相關標籤/搜索