笨辦法學 C語言 (Learn C the Hard Way: Practical Exercises on the Computational Subjects You Keep Avoiding)

Zed A. Shaw 著

買這商品的人也買了...

商品描述

這本書的目標是讓讀者掌握足夠的C語言技能,從而可以自己用C語言編寫程序或者修改別人的C語言代碼,成為一名的程序員。但這並不完全是一本講C語言編程的書,書中還重點介紹防禦性編程。本書以習題的方式引導讀者一步一步學習編程,結構非常簡單,共包括52個習題,每一個習題都重點講解一個重要的主題,多數是以代碼開始,然後解釋代碼的編寫,再運行並測試程序,給出附加任務。此外,每個習題都配套教學視頻。
本書是寫給學過編程語言的讀者的,本書有趣、簡單,並且講解方法獨特,讓讀者瞭解眾多C語言的基礎知識和C程序中常見的缺陷,在慢慢增強自己的技術能力的同時,深入瞭解怎樣破壞程序,以及怎樣讓代碼更安全。

作者簡介

作者:[美]澤德A.肖(Zed A. Shaw)譯者:王巍巍

澤德A.肖(Zed A.Shaw)是一位狂熱的吉他手、程序員和編程書作家。他的
書教會了世界各地的上百萬人如何編寫軟件。他的《笨辦法學Python》和《笨辦法學
Ruby》《》(這兩本書都已出到第3版)在全球擁有數百万讀者。他編寫的軟件大大
小小的企業都在使用。他的文章經常被眾多極客圈的人閱讀和引用。他是一位活
躍而有趣的作家,他會讓你大笑,也會讓你思考。

目錄大綱

習題0準備工作1 
Linux 1 
Mac OS X 1 
Windows 2 
文本編輯器2 

習題1打開塵封的編譯器4 
代碼詳解4 
應該看到的結果5 
如何破壞程序5 
附加任務6 

習題2使用Makefile構建程序7 
使用make 7 
應該看到的結果8 
如何破壞程序9 
附加任務9 

習題3格式化打印10 
應該看到的結果10 
外部研究11 
如何破壞程序11 
附加任務12 

習題4使用調試器13 
GDB小技巧13 
GDB快速參考13 
LLDB快速參考14 

習題5記憶C語言運算符15 
如何記憶15 
運算符列表16 

習題6記憶C語言語法19 
關鍵字19 
語法結構20 
鼓勵的話23 
告誡的話24 

習題7變量和類型25 
你應該看到的結果26 
如何破壞程序27 
附加任務27

習題8 if, else-if, else 28 
應該看到的結果29 
如何破壞程序29 
附加任務30 

習題9 while循環和布爾表達式31 
應該看到的結果31 
如何破壞程序32 
附加任務32 

習題10 switch語句33 
應該看到的結果35 
如何破壞程序36 
附加任務36 

習題11數組和字符串37 
應該看到的結果38 
如何破壞程序39 
附加任務39 

習題12數組和大小41 
應該看到的結果42 
如何破壞程序43 
附加任務43 

習題13 for循環和字符串數組44 
應該看到的結果45 
理解字符串數組46 
如何破壞程序46 
附加任務46 

習題14編寫和使用函數47 
應該看到的結果48 
如何破壞程序49 
附加任務49 

習題15指針,可怕的指針50 
應該看到的結果52 
解釋指針53 
指針的實際應用54 
指針詞彙表54 
指針不是數組54 
如何破壞程序55
附加任務55 

習題16結構體和指向結構體的指針56 
應該看到的結果59 
什麼是結構體59 
如何破壞程序60 
附加任務60 

習題17內存分配:堆和棧61 
應該看到的結果67 
堆分配和棧分配的區別67 
如何破壞程序68 
附加任務69 

習題18指向函數的指針70 
應該看到的結果74 
如何破壞程序74 
附加任務75 

習題19 Zed的強悍的調試宏76 
C語言錯誤處理的問題76 
調試宏77 
使用dbg.h 79 
應該看到的結果82 
CPP如何擴展宏82 
附加任務84 

習題20調試技巧85 
調試打印和GDB 85 
調試策略86 
附加任務87 

習題21數據類型與流程控制88 
可用數據類型88 
類型修飾符88 
類型限定符89 
類型轉換89 
類型大小89 
可用運算符91 
數學運算符92 
數據運算符92 
邏輯運算符92 
位運算符93
布爾運算符93 
賦值運算符93 
可用的控制結構94 
附加任務94 

習題22棧、作用域和全局變量95 
ex22.c和ex22.h 95 
ex22_main.c 97 
應該看到的結果99 
作用域、棧和bug 100 
如何破壞程序101 
附加任務101 

習題23達夫設備102 
應該看到的結果105 
謎底105 
何必呢106 
附加任務106 

習題24輸入、輸出、文件107 
應該看到的結果109 
如何破壞程序110 
I/O函數110 
附加任務111 

習題25變參函數112 
應該看到的結果116 
如何破壞程序116 
附加任務116 

習題26 logfind項目117 
logfind的需求117 

習題27創造性與防禦性編程118 
創造性程序員思維模式118 
防禦性程序員思維模式119 
防禦性編程的八個策略119 
應用八大策略120 
信任輸入120 
預防錯誤122 
儘早出錯,公開出錯123
記錄假設124 
預防優先,文檔其次124 
自動化一切125 
簡潔明了125 
質疑126 
次序不重要126 
附加任務127 

習題28 Makefile中級課程128 
基本項目結構128 
Makefile 129 
開頭130 
構建目標131 
單元測試132 
清理133 
安裝133 
檢查工具134 
應該看到的結果134 
附加任務135 

習題29庫和鏈接136 
動態加載共享庫137 
應該看到的結果139 
如何破壞程序140 
附加任務141 

習題30自動化測試142 
為測試框架連線143 
附加任務147 

習題31常見未定義行為148 
重要的20個未定義行為149 
常見的未定義行為149 

習題32雙鍊錶153 
什麼是數據結構153 
創建庫153 
雙鍊錶154 
定義155 
實現156 
測試160 
應該看到的結果162
如何改進程序163 
附加任務163 

習題33鍊錶算法164 
冒泡排序和歸併排序164 
單元測試165 
實現167 
應該看到的結果170 
如何改進程序170 
附加任務171 

習題34動態數組172 
優勢和劣勢180 
如何改進程序180 
附加任務181 

習題35排序和搜索182 
基數排序和二分搜索185 
C語言的聯合體186 
實現188 
RadixMap_find與二分搜索194 
RadixMap_sort和radix_sort 194 
如何改進程序195 
附加任務196 

習題36更安全的字符串197 
為什麼C語言的字符串糟透了197 
使用bstrlib 198 
學習庫199 

習題37散列表201 
單元測試208 
如何改進程序211 
附加任務211 

習題38散列表算法213 
應該看到的結果218 
如何破壞程序219 
附加任務220 

習題39字符串算法221 
應該看到的結果228
分析結果230 
附加任務231 

習題40二叉搜索樹232 
如何改進程序245 
附加任務245 

習題41 devpkg項目246 
devpkg是什麼246 
我們要實現的東西246 
設計247 
Apache Portable Runtime 247 
項目佈局248 
其他依賴249 
Makefile文件249 
源代碼文件250 
DB函數251 
shell函數254 
命令函數259 
devpkg主函數264 
zui後的挑戰267 

習題42棧與隊列268 
應該看到的結果271 
如何改進程序272 
附加任務272 

習題43簡單的統計引擎273 
滾動標準差和平均值273 
實現274 
如何使用這個引擎279 
附加任務280 

習題44環形緩衝區281 
單元測試284 
應該看到的結果284 
如何改進程序285 
附加任務285 

習題45簡單的TCP/IP客戶端286 
加強Makefile 286
netclient的代碼286 
應該看到的結果290 
如何破壞程序291 
附加任務291 

習題46三元搜索樹292 
優點和缺點300 
如何改進程序300 
附加任務301 

習題47快速URL路由302 
應該看到的結果305 
如何改進程序305 
附加任務306 

習題48簡單網絡服務器307 
規格說明307 

習題49統計服務器308 
規格說明308 

習題50統計數據的路由309 

習題51存儲統計數據310 
軟件規格310
 
習題52入侵和改進你的服務器311 
接下來的路312