c++学习笔记:黑客攻击系统-功能菜单
文章目錄
- 第 1 節:項目需求
- 第 2 節:項目實現
- 第 3 節:項目剖析
- 3.1編程的本質
- 3.2 極簡的 C/C++ 語言語法規則
- 3.3 頭文件的使用
- 3.4 程序從哪里開始執行-main 函數
- 3.5 使用其他函數
- 3.6 不變的誓言-“字符串常量”
- 3.7 讓計算機說話:cout 和 printf 的使用
- 3.8命名空間的使用
- 3.9 軟件是怎樣煉成的: C++程序的編譯過程
- 3.10 程序的注釋
第 1 節:項目需求
??本次通過模擬黑客攻擊系統的界面來學習C++的一些入門知識。初學者打開這個攻擊系統后,首先看到的就是一個“功能菜單”。 以便讓黑客選擇所需要的功能。 假設需求如下:
1. 網站 404 攻擊
2. 網站篡改攻擊
3. 網站攻擊記錄
4. DNS 攻擊
5. 服務器重啟攻擊
第 2 節:項目實現
在vs2022中創建一個空項目 , 添加源文件 main.c
#include <iostream> #include <Windows.h> /*1.網站 404 攻擊 2.網站篡改攻擊 3.網站攻擊記錄 4.DNS 攻擊 5.服務器重啟攻擊 */ int main(void){ std::cout << "1.網站 404 攻擊" << std::endl; std::cout << "2.網站篡改攻擊" << std::endl; std::cout << "3.網站攻擊記錄" << std::endl; std::cout << "4.DNS 攻擊" << std::endl; std::cout << "5.服務器重啟攻擊" << std::endl;system("pause"); return 0; }編譯結果如下:
第 3 節:項目剖析
3.1編程的本質
本質就是:“程序員”預先編寫一系列命令,控制程序執行特定的任務。 “程序員”就是“上帝”。
??失去控制?除非程序有 Bug… 說到BUG,有一個大事件是計算機時鐘 BUG 導致美軍海灣戰爭中,唯一過百的傷亡(死 28 人,傷 100 余人) 。
??BUG 事件:1991 年 2 月,美軍的愛國者反導彈系統失效,未能攔截伊拉克的飛毛腿導彈,宰 赫蘭基地被炸毀,場炸死 28 個美國士兵,炸傷 100 多人,造成美軍海灣戰爭中唯一一次傷 亡超過百人的重大損失。 BUG 分析:愛國者反導彈系統,每工作 1 小時,系統時鐘延時 3ms 左右,當時已經連續工作 了 100 小時,延時達到三分之一秒!飛毛腿導彈足以擊中目標了! 需要關機重啟,戰事太急,沒時間關機 。
??重要的事情再說一遍: 編程,就是使用程序員的思維,來控制計算機做事情。
3.2 極簡的 C/C++ 語言語法規則
原始的規則:
都是合法的。
而 intmain(void) 是非法的。
2. 必須使用英文輸入法輸入(僅雙引號括起來的“字符串”中可使用中文)
3. 每條代碼的后面使用 ;表示這個指令代碼結束。
4. #include 等預處理指令,必須一條指令占一行 其他規則不需記憶,在后面的項目實踐中掌握。
以下代碼也能編譯運行,但給人的美觀度非常差。 高逼格的代碼: (推薦),看上去結構清晰,很快清楚代碼所表達的內容。無論如何,只要遵循最基本的原則, 代碼就是合法的, 就能編譯執行. 懂得最基本的規則之后, 再追求優雅風格的代碼(高逼格風格)。
3.3 頭文件的使用
3.3.1為什么要使用頭文件
??程序如戲 程序中有很多元素(std::cout, system), 都是一個個演員 但是他們之間都互不認識, 但是卻要一起合作,強行編譯, 就會導致錯誤! 得預先介紹他們, 知道他們各自的名號和用法。
??解決方案: 包含相應的頭文件! (頭文件中, 含有相關元素的介紹說明)
std::cout??需要包含頭文件: iostream
system???需要包含頭文件: Windows.h
#include <Windows.h> ??表示把文件 Windows.h 中的所有內容拷貝(復制)到“這里”。
3.3.2頭文件的查找路徑
<>表示,從編譯器默認的路徑中去找文件 stdio.h 這個默認路徑,取決于編譯器。不同平臺下不同編譯器的路徑都不相同。 這個默認路徑下,已經包含了 c 標準庫所需要的所有頭文件。 使用 C++標準庫的頭文件使用該方式。 #include “mytest.h”
“” 表示從當前目錄下尋找文件 mytest.h 如果在當前目錄下找不到,再從編譯器默認的路徑中查找。 使用用戶自定義的頭文件使用該方式。
3.3.3頭文件的位置
要求放在文件的最前面。 #include 的作用是,把相關的聲明拷貝到這個文件內, 所以都習慣把#include 放到文件的最前面。 如果放到后面,當 include 之前出現了相關的函數,就會有問題,例如下面這個程序:
3.4 程序從哪里開始執行-main 函數
??人生,就是一個程序。在不同的階段,做不同的事。每件事,就是一個函數。 每個人的人生都不相同,以不同的順序,做不同的事(相當于調用不同的“函數”),但是都是從“出生”開始。
??每個軟件也各不相同,包含不同的函數,但是都是從 main 函數開始:
3.4.1main 函數的要求:
3.4.2 main 函數的作用:
??main 函數是程序的唯一入口。也就是說,程序運行時,首先從 main 函數開始執行。 一個程序,必須要有一個 main 函數,而且也只能有一個 main 函數。
main 函數的格式:
格式 1: int main(void) { }
格式 2: 具體用法在后面的函數部分,再詳細講解
3.4.3 main 函數的返回值
??main 函數應該用 return 返回一個 int 類型數據,也就是說,必須返回一個整數。
一般用法:
程序成功結束,則 main 函數返回 0 程序有異常,則返回一個大于 0 的整數。
3.5 使用其他函數
??真正強大的人,總是善于使用各種資源。 使用已有的函數,來完成自己的工作,而不是一切都由自己來實現。有一句IT 格言:不要重復制造輪子 —《人月神話》,就是說要盡可能使用已經開發好的函數。
那么有哪些“其它函數”呢?
1.C 標準庫
2.C++標準庫
3.第三方開源框架
4.公司內已經開發好的函數
5.程序員自己定義的函數
3.6 不變的誓言-“字符串常量”
??字符常量是由一對單撇號括起來的單個字符,如 ‘a’、‘D’、‘?’、‘$’。在 C/C++ 語言中,除了字符常量外還有字符串常量,顧名思義就是多個“字符”串在一起。與字符常量有所不同,字符串常量是用“雙撇號”括起來的多個字符的序列,如"How are you"、“I love you”、“你好”。當然,只要是“雙撇號”括起來的,就算只有一個字符也叫字符串,如"a"。字符常量 ‘a’與字符串常量"a"是不同的。
??一個字符在內存中只占一字節,而字符串本質上是多個字符組成的字符數組,C/C++語言規定,在每一個字符串常量的結尾,系統都會自動加一個字符’\0’作為該字符串的“結束標志符”,系統據此判斷字符串是否結束。這里要特別強調一點:‘\0’是系統自動加上的,不是人為添加的。
??‘\0’ 是 ASCII 碼為 0 的字符,它不會引起任何控制動作,也不是一個可以顯示的字符。比如字符串常量"CHINA",表面上看它只有 5 個字符,但實際上它在內存中占 6 字節,‘C’、‘H’、‘I’、‘N’、‘A’、’\0’ 各占一字節。如果要輸出該字符串,‘\0’ 不會輸出。也就是說,雖然實際上總共有 6 個字符,‘\0’ 也包括在其中,但輸出時 ‘\0’ 不會輸出。系統從第一個字符 ‘C’ 開始逐個輸出字符,直到遇到 ‘\0’,則表示該字符串結束,停止輸出。
??也就是說,在字符串常量中,如果“雙撇號”中能看見的字符有 n 個,那么該字符串在內存中所占的內存空間為 n+1 字節。
“你愛我嗎”
“I love you.”
“我的戰斗力是”是字符串常量 ,10000 是整數常量。
`std::cout << “9527”<<“的年齡是” << 38;`“9527”是字符串常量 ,38 是整數常量
??常量和變量的區別?
常量:在程序整個運行期間,值不會發生任何變化。 變量:在程序整個運行期間,值隨時可以發生變化。
3.7 讓計算機說話:cout 和 printf 的使用
3.7.1C++風格的打印:
實例:
使用要求: 需要包含頭文件 #include 注意不是#include <iostream.h>
std 是一個命名空間(下一節詳細講解), cout 是 std 命名空間內的一個“對象”。 endl 也是 std 命名空間內的一個對象,用來表示“回車符”(換到下一行的最前面)。
對象:先簡單的理解為一個具體的實體。(在后續視頻中,會詳細介紹 C++面向對象的概念)
std::cout << 相當于調用了一個特殊的函數(但不是函數),用來打印數據。
std::cout << “你好!” << “Rock!”;
等效于:
std::cout << “你好!”; std::cout << “Rock!”; std::cout, 可以連續輸出任意多個數據,中間用 << 隔開。
3.7.2 C 風格的打印:
實例:
說明:
特別注意:
??std::cout 和 printf 還有很多用法,現在只需要掌握以上最常用的用法,其他的用法現在不需要關注。其他用法在后續課程中,需要時再講解。
打印語句的使用場合:
?? ‘打印’常常指:把信息輸出到“標準輸出設備”(標準輸出設備,就是顯示器中的“終端”)。
3.8命名空間的使用
3.8.1使用命名空間。
用法 1:
用法 2:
#include <iostream> #include <string> namespace China { float population = 14.1; //單位: 億 std::string capital = "北京"; } namespace Japan { float population = 1.27; //單位: 億 std::string capital = "東京"; }//注意:沒有 namespace //直接指定命名空間中的標識符,而不是整個域名 using China::capital; using Japan::population; int main(void) {std::cout << "首都:" << capital << std::endl; std::cout << "人口:" << population << std::endl; system("pause"); return 0; }用法 3:
#include <iostream> #include <string> namespace China { float population = 14.1; //單位: 億 std::string capital = "北京"; } namespace Japan { float population = 1.27; //單位: 億 std::string capital = "東京"; } using namespace China; using Japan::population; int main(void) { std::cout << "首都:" << capital << std::endl; std::cout << "人口:" << population << std::endl; //出錯! system("pause"); return 0; }錯誤提示: population”: 不明確的符號。
錯誤原因:
解決方案: 指定完整的域名(Japan::population )來表示。
說明: 這個程序中的 string 是 c++的字符串類型,先簡單了解即可,以后會詳細學習到。
3.9 軟件是怎樣煉成的: C++程序的編譯過程
使用 vs, 只需單擊一下,就把源代碼轉換成“軟件”。
背后實際經歷了一下 4 個處理階段:
3.10 程序的注釋
3.10.1注釋的目的:
為了讓程序更方便閱讀(“可讀”),以便于維護。
3.10.2需要注釋的內容:
3.10.3注釋的方式
有兩種注釋方式
1 單行注釋 // 在行尾,或代碼的上一行 在代碼的下一行也可以,但很少有人這么做。
. 多行注釋 /* */ 不支持嵌套。
2 不要為了注釋而注釋! 過多的注釋,反而有害!會把真正需要注意的東西淹沒。
3.10.4注釋的風格
函數的注釋,有特別的“姿勢”,可以讓代碼顯得更規范。
總結
以上是生活随笔為你收集整理的c++学习笔记:黑客攻击系统-功能菜单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解直播及其工作原理
- 下一篇: 安全管理实务之四:口令管理(转)