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