具體描述
內容簡介
閱讀《C語言實用之道》,可以學習實用的C技術,包括在可復用的函數中經常用到的算法。在本書中,你將輕鬆獲得以下代碼和建議:代碼布局和預處理器;控製結構、迭代和選擇;指針和結構;數據庫;可復用性;列錶、數組、FIFO和棧;搜索和排序;遞歸;二叉樹;C語言中的和自建的字符串輔助功能;使用Mongoose開發Web服務;構建MathSearch迷宮的遊戲應用代碼;以及嵌入式軟件。
《C語言實用之道》除瞭提供可立即投入使用的模塊以外,還教你如何充分用好C語言,這是很多麵嚮初學者的其他書籍所不能提供的。
本書特色
避免常見的C陷阱與缺陷
用好列錶和數組
執行搜索和排序
利用二叉樹存儲和檢索數據
用好遞歸
管理異常
訪問數據庫
利用數值計算方法,結閤實際應用計算積分
通過一種便捷的、不齣錯的方法來操縱字符串
構建一個MathSearch遊戲應用(類似於WordSearch遊戲)
通過一種便捷的、不齣錯的方法來操縱字符串
處理與嵌入式應用相關的問題
作者簡介
作者簡介:在Zambon的職業生涯中,他去過五個不同國傢的八個城市,曾任軟件開發人員、係統顧問、過程改進經理、項目經理和首席運營官。自2008年初以來,他緻力於編寫軟件來生成和解決數字難題。
訪問他的網站http://zambon.com.au/,可以看到他撰寫的論文和所著書籍的完整列錶。
譯者簡介:
潘愛民,任職於阿裏巴巴業務平颱事業部,擔任首席架構師職位。長期從事軟件和係統技術的研究與開發設計工作,撰寫瞭大量軟件技術文章,著譯瞭多部經典計算機圖書,在國內外學術刊物上發錶瞭30多篇文章。曾任教於北京大學和清華大學(兼職),後進入工業界,先後任職於微軟亞洲研究院、盛大網絡發展有限公司和阿裏巴巴集團。獲得瞭數學學士學位和計算機科學博士學位,主要研究領域包括軟件設計、信息安全、操作係統和互聯網技術。
目錄
第1章 引言 1
1.1 編碼風格 1
1.1.1 縮進 2
1.1.2 命名和其他規範 4
1.1.3 goto的使用 5
1.2 如何閱讀本書 7
第2章 微妙之C 9
2.1 變量的作用域和生命周期 9
2.1.1 局部變量 9
2.1.2 全局變量 13
2.1.3 函數 14
2.2 按值調用 15
2.3 預處理器宏 18
2.4 布爾值 19
2.5 結構打包 22
2.6 字符和區域 24
2.7 普通字符和寬字符 27
2.8 處理數值 32
2.8.1 整數 32
2.8.2 浮點數 34
2.9 本章小結 54
第3章 迭代、遞歸和二叉樹 55
3.1 迭代 55
3.2 遞歸 57
3.3 二叉樹 59
3.3.1 圖形化顯示一棵樹 65
3.3.2 生成一棵隨機樹 83
3.3.3 遍曆一棵樹 88
3.3.4 更多關於二叉樹的內容 93
3.4 本章小結 95
第4章 列錶、棧和隊列 97
4.1 列錶 98
4.2 棧 99
4.2.1 基於數組的棧 99
4.2.2 基於鏈錶的棧 109
4.3 隊列 113
4.3.1 基於數組的隊列 114
4.3.2 基於數組的隊列的更多內容 120
4.3.3 基於鏈錶的隊列 126
4.4 本章小結 130
第5章 異常處理 133
5.1 長跳轉 134
5.2 THROW 135
5.3 TRY和CATCH 136
5.4 多個CATCH 144
5.5 多個TRY 145
5.6 異常用法樣例 149
5.7 本章小結 152
第6章 字符串輔助功能 153
6.1 字符串的分配和釋放 154
6.1.1 str_new( ) 155
6.1.2 str_release( ) 159
6.1.3 str_release_all( ) 161
6.1.4 str_list( ) 162
6.1.5 一些例子 163
6.1.6 多個棧 166
6.2 字符串格式化 169
6.3 字符串信息 171
6.4 字符串更新 173
6.4.1 字符串拷貝 173
6.4.2 字符串轉換 176
6.4.3 字符串整理 177
6.4.4 字符串移除 179
6.5 搜索 181
6.5.1 找到一個字符 181
6.5.2 找到一個子串 186
6.6 替換 189
6.6.1 替換一個字符 189
6.6.2 替換一個子串 191
6.7 提取一個子串 193
6.8 拼接字符串 196
6.9 更多功能 200
6.10 本章小結 201
第7章 動態數組 205
7.1 數組的分配與釋放 205
7.1.1 分配一個數組 206
7.1.2 釋放一個數組 208
7.1.3 多個棧 212
7.2 改變一個數組的大小 215
7.3 數組的拷貝和復製 219
7.4 選擇數組元素 222
7.5 本章小結 225
第8章 搜索 227
8.1 比較 227
8.1.1 C語言的標準比較函數 227
8.1.2 比較結構 230
8.1.3 比較數組 232
8.1.4 模糊化 232
8.2 搜索 238
8.2.1 未排序的整數數組 238
8.2.2 未排序的指針數組 246
8.2.3 排序的數組 251
8.2.4 鏈錶與二叉搜索樹 257
8.3 本章小結 277
第9章 排序 279
9.1 插入排序 279
9.2 希爾排序 280
9.3 冒泡排序 285
9.4 Quicksort(快排) 286
9.5 整數數組 296
9.6 標準C函數 298
9.7 本章小結 301
第10章 數值積分 303
10.1 從單變量函數開始 303
10.2 梯形規則 306
10.3 Simpson規則 310
10.4 Newton-Cotes公式 313
10.5 決定何時停止 317
10.6 奇點 321
10.7 濛特卡洛 324
10.8 3D積分 329
10.8.1 積分域 330
10.8.2 從2D的梯形到3D的棱柱 331
10.8.3 改進棱柱規則 336
10.8.4 將矩形規則轉換成3D 340
10.9 多重積分的最後一些考慮 342
10.10 本章小結 343
第11章 嵌入式軟件 345
11.1 位操作 346
11.2 端 349
11.3 嵌入式環境 351
11.3.1 裸主闆 351
11.3.2 實時OS(RTOS) 352
11.3.3 高級OS 353
11.4 信號和中斷 353
11.5 並發性 365
11.6 本章小結 371
第12章 數據庫 373
12.1 MySQL 374
12.1.1 使用CLI創建和填充一個數據庫 374
12.1.2 MySQL Workbench 380
12.1.3 在C程序中使用MySQL 382
12.2 SQLite 395
12.2.1 在CLI中使用SQLite 398
12.2.2 在C程序中使用SQLite 399
12.2.3 使用動態字符串和數組 404
12.3 本章小結 408
第13章 使用Mongoose開發Web服務器 409
13.1 Web頁麵和協議 409
13.2 動態Web頁麵 413
13.3 最簡單的支持Web服務器的應用程序 413
13.3.1 事件處理器函數 415
13.3.2 主程序 416
13.4 支持Web服務器的應用程序 416
13.4.1 靜態變量 419
13.4.2 main( ) 420
13.4.3 e_handler( )、get_x( )和send_response( ) 420
13.4.4 index.html 423
13.5 定製Mongoose 428
13.6 本章小結 431
第14章 遊戲應用:MathSearch 433
14.1 MathSearch規範和設計 434
14.1.1 MathSearch規範 434
14.1.2 MathSearch設計 435
14.2 實現MathSearch 437
14.3 模塊:count 456
14.4 模塊:display 457
14.5 模塊:save_html 464
14.6 模塊:save_images 470
14.7 本章小結 475
附錄A 縮寫詞 477
附錄B SQL介紹 483
前言/序言
這是一本講述C語言實踐的書,作者以自身的實踐和思考來展示C語言編程中的基礎概念和典型使用場景。C語言本身簡潔而又靈活,有強大的錶達能力,幾乎可以實現迄今為止所有能夠想象到的計算能力。然而,越來越多的程序員在棄用C語言,改而學習更具生産效率的編程語言。很多人提齣的一個問題是,學瞭C語言有什麼用?從現實的角度,用C語言編寫的、新的大型軟件越來越少,但是,一些關鍵的軟件往往離不開C語言,如圖形引擎、網絡協議等一些性能關鍵的模塊,當然少不瞭像操作係統和驅動程序之類的最底層軟件。因此,C語言在各種編程語言排行榜上始終排在前列。另外,C語言也適閤一些“小而美”的程序,在《C語言實用之道》中可以看到這樣一些例子。以我個人之見,C語言是最貼近計算機工作原理的高級語言,並且Internet上有豐富的文檔和代碼積纍,每一個對計算機工作原理有好奇心的IT從業人員都應該掌握C語言。
《C語言實用之道》內容涵蓋兩大部分。第一部分介紹C語言編程中的基本概念和程序設計基礎(前7章),涉及變量、宏、結構、本地化、寬字符、整數和浮點數的錶達形式等基本語言層麵的概念和要點(第2章),也包括迭代、遞歸、鏈錶、棧、隊列、異常等程序設計中廣泛使用的設計元素(第3至第5章),同時作者還完整剖析瞭兩個實用案例:字符串(第6章)和動態數組(第7章)。第二部分是用C語言來完成特定領域中的開發示例,包括搜索(第8章)、排序(第9章)、數值積分(第10章)、嵌入式軟件開發(第11章)、嵌入數據庫功能(第12章)、嵌入Web服務器(第13章)以及遊戲應用開發(第14章)。即使讀者在實踐中不需要涉獵如此廣泛的應用範圍,通過閱讀這些章,也可以瞭解到C語言在這些領域中是如何被使用並發揮作用的。
這不是一本教科書,但是其內容非常適閤學習C語言,並且作者的敘述風格也很有特色,他直接以第一人稱和第二人稱來講解書中的內容,就好像在課堂上傳授C語言的開發經驗。《C語言實用之道》在錶達上有明顯的口語化特點,相信在閱讀時會有一種親切感,學習也相對要輕鬆一些。然而,《C語言實用之道》通過大量的例子和代碼來講解概念和技巧,這確保瞭《C語言實用之道》內容的嚴謹性,並且不少代碼非常有啓發意義。此外,《C語言實用之道》的代碼又是成體係的,前後一緻性比較好,如第6和第7章中講到的字符串和動態數組組件,在後麵的章節中也都用到瞭。從這個角度看,這《C語言實用之道》又非常適閤作為課程參考材料,教師在講解瞭C語言基礎知識以後,可以成體係地引入這《C語言實用之道》中的內容。
我已經很多年沒有接手翻譯或著書的工作瞭,當王軍編輯嚮我推薦這《C語言實用之道》時,無論是內容,還是作者的經曆,都引起我的共鳴。作為一名C程序員老兵,我看到每一個標準C函數都有一種親切感。基於這樣的心情,我答應王軍編輯翻譯這《C語言實用之道》。經過一年來的努力,終於完成瞭翻譯工作。原著中有一些筆誤,我在翻譯過程中修正瞭一些,但我相信,翻譯本身難免也會引入新的錯誤,雖然經過兩遍校對,但還會留有錯誤,請讀者諒解。
潘愛民
2017年12月於杭州
《深入淺齣 C 語言:從入門到精通的實戰指南》 一、引言:踏上 C 語言的編程之旅 在信息技術飛速發展的今天,編程語言如同現代世界的通用語,而 C 語言,作為一門古老而強大的編程語言,至今仍活躍在操作係統、嵌入式係統、遊戲開發、高性能計算等諸多領域。它以其高效、靈活和貼近硬件的特性,為無數開發者奠定瞭堅實的編程基礎。 本書《深入淺齣 C 語言:從入門到精通的實戰指南》旨在為廣大編程愛好者、初學者以及希望鞏固 C 語言知識的開發者提供一本全麵、係統且極具實踐性的學習資料。我們不追求花哨的理論堆砌,而是力求將 C 語言的核心概念、精髓技巧以及實際應用場景抽絲剝繭,以清晰易懂的方式呈現給讀者。本書的設計理念是“學以緻用”,每一個知識點的講解都將與實際的代碼示例緊密結閤,引導讀者在動手實踐中加深理解,掌握編程的藝術。 二、本書內容概覽:構建堅實的 C 語言知識體係 本書的內容編排循序漸進,從最基礎的 C 語言入門知識,逐步深入到高級特性和實際開發中的常見問題。我們將帶您領略 C 語言的魅力,並逐步構建起一套完整、紮實的 C 語言知識體係。 第一部分: C 語言的基石——認識與入門 第一章:編程世界的入口——為什麼選擇 C 語言? 簡要介紹編程語言的曆史與發展,定位 C 語言在整個編程生態中的重要地位。 分析 C 語言的特點:高效性、可移植性、強大的控製能力,以及它在現代技術領域中的廣泛應用(如操作係統內核、嵌入式設備、遊戲引擎等)。 為讀者描繪學習 C 語言的宏大藍圖,激發學習熱情。 第二章:我的第一個 C 程序——“Hello, World!”的奧秘 詳細講解 C 語言程序的結構:`include` 指令、`main` 函數、語句、注釋等基本組成部分。 介紹 C 語言的開發環境搭建:編譯器(如 GCC)、集成開發環境(IDE,如 VS Code, Code::Blocks)的安裝與配置。 指導讀者編寫、編譯、運行第一個簡單的 C 程序,讓“Hello, World!”不僅僅是一個口號,更是開啓編程之旅的鑰匙。 第三章:數據與變量——構建信息的世界 深入理解 C 語言中的基本數據類型:`int`(整型)、`float`(單精度浮點型)、`double`(雙精度浮點型)、`char`(字符型)等。 講解變量的聲明、初始化與賦值,理解變量在內存中的存儲方式。 介紹常量與符號常量的使用,強調其在代碼可讀性和維護性上的優勢。 第四章:運算符與錶達式——指揮數據的行動 詳解算術運算符(`+`, `-`, ``, `/`, `%`)及其運算規則。 介紹關係運算符(`>`, `<`, `>=`, `<=`, `==`, `!=`)和邏輯運算符(`&&`, `||`, `!`)在條件判斷中的應用。 講解位運算符(`&`, `|`, `^`, `~`, `<<`, `>>`)的原理與實際應用,為後續深入理解硬件操作打下基礎。 理解運算符的優先級與結閤性,避免常見的計算錯誤。 第五章:控製流——程序的邏輯骨架 分支結構: 詳細講解 `if-else` 語句、`switch-case` 語句,如何根據條件執行不同的代碼塊,實現程序的選擇性執行。 循環結構: 深入剖析 `while` 循環、`do-while` 循環、`for` 循環,掌握在特定條件下重復執行代碼的方法。 `break` 和 `continue` 語句在循環和 `switch` 語句中的作用,如何靈活控製程序流程。 第二部分: C 語言的核心——數據結構與函數 第六章:數組——數據的有序集閤 理解一維數組的聲明、初始化和訪問。 學習多維數組(二維數組為主)的錶示與操作,及其在矩陣運算等場景的應用。 數組與指針的緊密關係:數組名的含義,通過指針訪問數組元素。 第七章:指針——內存世界的導航者 指針的概念: 什麼是內存地址,指針變量的聲明與解引用。 指針與數組: 進一步深入探討指針與數組的關係,數組指針、指針數組的區彆。 指針運算: 理解指針的加減運算,以及它與數組下標訪問的等價性。 指針的妙用: 函數指針、指嚮指針的指針,以及它們在動態內存分配、迴調函數等方麵的應用。 第八章:函數——模塊化編程的基石 函數的定義與調用: 理解函數的返迴值、參數傳遞(值傳遞與引用傳遞,通過指針實現)。 函數原型與聲明: 確保編譯器瞭解函數的簽名,避免編譯錯誤。 遞歸函數: 探索函數調用自身的奧秘,掌握解決某些問題的優雅方式(如斐波那契數列、階乘)。 作用域與生命周期: 理解局部變量、全局變量、靜態變量的作用域與生命周期,以及它們對程序行為的影響。 第九章:字符串——文本的處理藝術 C 語言中字符串的本質:字符數組與字符串結束符 ` `。 常用的字符串處理函數:`strlen`, `strcpy`, `strcat`, `strcmp`, `strstr` 等,掌握字符串的常用操作。 使用指針進行字符串操作,實現更高效的文本處理。 第三部分: C 語言的進階——內存管理與高級特性 第十章:結構體與聯閤體——自定義復雜數據類型 結構體(`struct`): 如何定義和使用結構體,將不同類型的數據組織在一起。 結構體成員訪問: 使用點運算符(`.`)和箭頭運算符(`->`)訪問結構體成員。 結構體與指針: 指嚮結構體的指針,以及在函數傳參中的應用。 聯閤體(`union`): 理解聯閤體的內存共享特性,以及其在節省內存空間方麵的應用。 枚舉(`enum`): 介紹枚舉類型,為程序中的常量定義提供更清晰的語義。 第十一章:文件輸入輸齣——數據的持久化 文件操作的基本流程: 打開文件、讀寫文件、關閉文件。 標準文件流: `stdin`, `stdout`, `stderr` 的概念和應用。 文件指針與緩衝: 理解 `FILE ` 類型,以及緩衝機製對文件讀寫效率的影響。 格式化輸入輸齣: `fprintf`, `fscanf`, `fgets`, `fputs` 等函數的深入講解。 二進製文件讀寫: `fread`, `fwrite` 的使用,以及在處理非文本數據時的重要性。 第十二章:預處理器——代碼的預處理魔法 宏定義(`define`): 常量宏和函數宏的定義與使用,代碼替換的機製。 條件編譯(`ifdef`, `ifndef`, `if`, `else`, `endif`): 實現根據不同條件編譯不同的代碼段,提高代碼的靈活性和可移植性。 文件包含(`include`): 理解頭文件在代碼組織和模塊化開發中的作用。 第十三章:動態內存分配——程序的彈性空間 內存的靜態分配與動態分配: 概念區分。 `malloc`, `calloc`, `realloc`, `free`: 掌握動態內存分配函數的使用,實現程序運行時的內存管理。 內存泄漏與野指針: 講解常見的內存管理問題及其規避方法。 動態數組的應用: 如何在運行時根據需求分配數組大小。 第四部分: C 語言的實踐——實戰項目與進階思考 第十四章:錯誤處理與調試——讓程序更健壯 常見的編程錯誤類型: 語法錯誤、邏輯錯誤、運行時錯誤。 調試技巧: 使用 `printf` 語句進行簡單調試,以及集成開發環境(IDE)提供的斷點、單步執行、觀察變量等高級調試功能。 返迴值與錯誤碼: 如何通過返迴值或錯誤碼來指示函數執行的狀態。 第十五章:綜閤實戰項目——學以緻用的典範 本書將通過幾個精心設計的實戰項目,將前麵學到的知識融會貫通。例如: 簡易通訊錄管理係統: 練習結構體、文件I/O、動態內存分配。 學生成績管理係統: 結閤數組、指針、函數、文件操作。 簡易文本編輯器: 挑戰更復雜的字符串處理和邏輯控製。 這些項目不僅是代碼的堆砌,更是解決實際問題的思維過程的展現。 第十六章:麵嚮對象思想在 C 語言中的體現(非 C++) 雖然 C 語言本身不是麵嚮對象語言,但可以通過一些設計模式和技巧來模擬麵嚮對象的思想,例如: 使用結構體模擬對象。 使用函數指針模擬方法。 封裝與抽象的概念在 C 語言中的實現方式。 這部分將幫助讀者理解麵嚮對象編程的思想,並將其運用到 C 語言的開發中,提升代碼的可維護性和可擴展性。 第十七章:未來展望與深入學習 簡單介紹 C 語言在操作係統、嵌入式開發、高性能計算等領域的更深入應用。 提供進一步學習的資源和方嚮,如 C++、操作係統原理、計算機網絡等。 鼓勵讀者保持學習的熱情,不斷探索編程的無限可能。 三、本書特色與優勢 循序漸進,邏輯清晰: 內容從基礎到高級,層層遞進,確保讀者能夠輕鬆理解並逐步掌握。 理論與實踐並重: 每一章節都配有大量的代碼示例,並提供練習題,強調動手能力。 貼近實際應用: 重點關注 C 語言在實際開發中的應用場景,幫助讀者快速上手。 深入剖析細節: 不止於講解“怎麼做”,更側重於“為什麼這麼做”,幫助讀者理解 C 語言的底層機製。 引導讀者思考: 提供解決問題的思路和方法,培養讀者的編程思維。 四、目標讀者 零基礎的編程初學者。 希望係統學習 C 語言,打下紮實編程基礎的學生。 需要迴顧和鞏固 C 語言知識的開發者。 對嵌入式係統、操作係統等底層開發感興趣的讀者。 《深入淺齣 C 語言:從入門到精通的實戰指南》將是您 C 語言學習道路上最可靠的夥伴。我們期待與您一起,在 C 語言的世界裏,探索編程的奧秘,創造屬於自己的精彩。