C 字串介紹

在 C 語言中,字串是一種特殊的 陣列: 字串是一個由 char 值組成的陣列: char name[7]; 當我們介紹資料型別時,我們已經提到 char 型別,簡單來說,它常用於儲存 ASCII 字元。 我們可以像初始化一般陣列一樣來初始化字串: char name[7] = { 'F', 'l', 'a', 'v', 'i', 'o' }; 或者更方便地使用字串字面值(也稱為字串常量),即用雙引號括起來的一系列字元: char name[7] = "Flavio"; 我們可以使用 printf() 函數並使用 %s 來輸出字串: printf("%s", name); 你有注意到「Flavio」有6個字元,但我們定義了長度為7的陣列嗎?為什麼呢?這是因為字串的最後一個字元必須是 0,即字串終止符號,在宣告陣列時我們必須為它留出空間。 這一點尤其在處理字串時需要注意。 談到字串處理,C 語言提供了一個重要的標準庫:string.h。 這個庫非常重要,因為它抽象了許多關於字串操作的低階細節,並為我們提供了一組實用的函數。 你可以在程式中加入以下指令來載入這個庫: #include <string.h> 一旦你這麼做了,你就可以使用以下函數: strcpy() 將一個字串複製到另一個字串中 strcat() 將一個字串附加到另一個字串的後面 strcmp() 對比兩個字串是否相等 strncmp() 對比兩個字串的前 n 個字元是否相等 strlen() 計算字串的長度 還有許多其他函數,等等。 我將在不同的博客文章中介紹這些字串函數,但你只需要知道它們存在即可。

C 結構體

C 結構體介紹 使用 struct 關鍵字,我們可以使用基本 C 型別來創建複雜的數據結構。 結構體是一個不同型別值的集合。在 C 語言中,數組 的型別是固定的,所以在很多情況下結構體會變得非常有趣。 以下是結構體的語法: struct <structname> { //...variables }; 例子: struct person { int age; char \*name; }; 你可以通過在右括號後面加上變量的名字來聲明一個結構體型別的變量,如下所示: struct person { int age; char \*name; } flavio; 或者多個變量,如下所示: struct person { int age; char \*name; } flavio, people[20]; 在這種情況下,我聲明了一個名為 flavio 的單個 person 變量,以及一個包含 20 個 person 的數組 people。 我們還可以在後面聲明變量,使用以下語法: struct person { int age; char \*name; }; struct person flavio; 我們可以在聲明時初始化結構體:...

C 語言中變數的作用範圍

了解作用範圍在 C 語言中的定義與運作方式。 在 C 語言程式中,當你宣告一個變數時,其作用範圍會根據你宣告的位置而有所不同。 這表示該變數在某些地方可用,但在其他地方則無法存取。 根據位置,變數可分為兩種類型: 全域變數 區域變數 以下是宣告於函式內部的區域變數範例: int main(void) { int age = 37; } 區域變數只能在函式內部存取,當函式結束時,它們將停止存在。它們會被從記憶體中釋放(但有些例外情況)。 而若在函式外部宣告的變數則為全域變數,像是以下範例: int age = 37; int main(void) { /* ... */ } 全域變數可在程式的任何函式中存取,並且在程式執行期間一直可用,直到結束。 我提到區域變數在函式結束後將不再可用。 這是因為預設情況下,區域變數是在堆疊(stack)上宣告的,除非你使用指標將其顯式配置於堆積中,但這樣你就得自行管理記憶體。

C 標頭檔案

如何使用 C 標頭檔案將程式分割成多個檔案 簡單的程式可以放在單一個檔案中,但當程式變得越來越龐大時,將它們全部放在一個檔案中將變得不可能。 您可以將程式的一部分放在一個獨立的檔案中,然後建立一個標頭檔案。 標頭檔案看起來像一個普通的 C 檔案,只是以 .h 結尾而不是 .c,且不同於函式的實作和程式的其他部分,它僅包含聲明。 當您第一次使用 printf() 函式或其他輸入/輸出函式時,您已經使用過標頭檔案,並且您必須輸入: #include <stdio.h> 來使用它。 #include 是一個預處理器指示。 預處理器會在標準庫中查找 stdio.h 檔案,因為您在它周圍使用了尖括號。要包含自己的標頭檔案,您將使用引號,就像這樣: #include "myfile.h" 上述將會在當前資料夾中查找 myfile.h。 您還可以使用資料夾結構來管理庫: #include "myfolder/myfile.h" 讓我們舉個例子。這個程式計算從給定年份至今的年數: #include <stdio.h> int calculateAge(int year) { const int CURRENT\_YEAR = 2020; return CURRENT\_YEAR - year; } int main(void) { printf("%u", calculateAge(1983)); } 假設我們想將 calculateAge 函式移到一個獨立的檔案中。 我們建立一個 calculate_age.c 檔案: int calculateAge(int year) { const int CURRENT\_YEAR = 2020; return CURRENT\_YEAR - year; } 還有一個 calculate_age....

c-conditionals

#C條件語句 C條件語句的介紹:if/else和switch 任何編程語言都提供了程序員進行選擇的能力。 我們希望在某些情況下執行X,在其他情況下執行Y。 我們希望檢查數據,並根據數據的狀態進行選擇。 C為我們提供了兩種方法來實現這一目的。 第一種是if語句,它具有else輔助語句,第二種是switch語句。 if 在if語句中,您可以檢查條件是否為真,然後執行提供在花括號中的區塊。 int a = 1; if (a == 1) { /\* 做點什麼 \*/ } 您可以添加else區塊,如果原始條件為false,則執行不同的區塊。 int a = 1; if (a == 2) { /\* 做點什麼 \*/ } else { /\* 做點其他的事情 \*/ } 注意一個常見的錯誤來源-在比較時始終使用比較運算符==,而不是賦值運算符= ,否則if條件檢查始終為true,除非參數為0,例如: int a = 0; if (a = 0) { /\* 從不被調用 \*/ } 為什麼會這樣?因為條件檢查將尋找布爾結果(比較的結果),而0這個數字始終等於false。其他一切都是true,包括負數。 您可以通過堆疊多個if語句來擁有多個else區塊: int a = 1; if (a == 2) { /\* 做點什麼 \*/ } else if (a == 1) { /\* 做點其他的事情 \*/ } else { /\* 再做點其他的事情 \*/ } switch 如果你需要做太多的if / else / if塊來進行檢查,也許是因為你需要檢查變量的確切值,那麼switch對你來說非常有用。...

c-constants

# C常量 介紹在C中處理常量的方式 在上一篇文章中,我介紹了[C中的變量](/ c-variables-types/)。 在這篇文章中,我想告訴您關於C中所有的常量。 常量的聲明方式與變量類似,只是在之前加上了const關鍵字,並且您總是需要指定一個值。 像這樣: const int age = 37; 這在C語言中是完全有效的,儘管通常常量的聲明是大寫的,就像這樣: const int AGE = 37; 這只是一個約定,但它在閱讀或撰寫C語言程序時非常有幫助,因為它提高了可讀性。大寫名稱表示常量,小寫名稱表示變量。 常量名遵循相同的命名規則,可以包含任何大寫或小寫字母,可以包含數字和下劃線字符,但不能以數字開頭。AGE和Age10都是有效的變量名,1AGE不是。 另一種定義常量的方式是使用以下語法: #define AGE 37 在這種情況下,您不需要添加類型,也不需要=等號,並且省略最後的分號。 C編譯器將在編譯時從指定的值推斷出類型。

c-quotes

#在C中的雙引號與單引號 如何在C中使用引號 在C中,您可能會在某些情況下使用雙引號,在其他情況下使用單引號。 在某些語言中,這兩者之間沒有區別。但是在C中,它們之間是有區別的,您將根據需要使用其中之一。 何時可以使用單引號,何時可以使用雙引號? 單引號用於識別單個字符(char值): char letter = 'a'; 雙引號用於創建字符串文字: char \*name = "Flavio"; 請注意,您可以創建單字母字符串文字: char \*letter = "a"; 但請記住,字符串由字符串的字符加上末尾的0字符組成,這使得單字母字符串文字占用單個字符的兩倍空間。

Cache API指南

Cache API是Service Worker规范的一部分,是一种更擅长资源缓存的强大方法。 介紹 檢測是否支持Cache API 初始化快取 將項目添加到快取 cache.add() cache.addAll() 手動抓取並添加 從快取中檢索項目 獲取所有快取中的項目 獲取所有可用的快取 從快取中刪除項目 刪除快取 介紹 Cache API是Service Worker规范的一部分,是一种更擅长资源缓存的强大方法。 它允许您缓存可通过URL访问的资源,这包括资产,网页和HTTP API响应。 它不适用于缓存单个数据块,这是IndexedDB API的任务。 目前在Chrome >= 40,Firefox >=39和Opera >= 27中可用。 Safari和Edge最近开始支持它。 Internet Explorer不支持该API。 在Android上的移动设备支持良好,在Android Webview和Chrome for Android上受支持,而在iOS上仅适用于Opera Mobile和Firefox Mobile用户。 檢測是否支持Cache API Cache API通过caches对象公开。要检测浏览器是否实现了该API,只需使用以下代码检查其是否存在: if ('caches' in window) { // ok } 初始化快取 使用caches.open API,它返回一个准备好使用的快取对象的Promise: caches.open('mycache').then(cache => { // 您可以开始使用快取 }) mycache是我用来标识要初始化的快取的名称。这类似于变量名称,您可以使用任何想要的名称。 如果快取尚不存在,caches.open会创建它。 将項目添加到快取 cache对象公开了两个方法来将项目添加到快取中:add和addAll。 cache.add() add接受一个URL,并在调用时获取该资源并将其缓存起来。 caches.open('mycache').then(cache => { cache.add('/api/todos') }) 为了在获取方面更具控制性,您可以传递一个请求对象而不是字符串,这是Fetch API规范的一部分:...

Channel Messaging API

Channel Messaging API允許iframe和worker通過通道與主文檔線程進行通信,通過傳遞消息。 [引言Channel Messaging API](#引言Channel Messaging API) 它是如何工作的 iframe的示例 [Service Worker的示例](#Service Worker的示例) 瀏覽器支援 引言Channel Messaging API 在同一個文檔中運行的兩個腳本,但處於不同的上下文中,Channel Messaging API允許它們通過通道進行通信。 此用例涉及以下通信方式: 文檔和iframe之間的通信 兩個iframe之間的通信 兩個文檔之間的通信 它是如何工作的 調用new MessageChannel()來初始化消息通道。 const channel = new MessageChannel() 該通道具有2個屬性,稱為 port1 port2 這些屬性均為MessagePort對象。port1是由創建通道的一方使用的端口,而port2是通道接收器使用的端口(順帶一提,通道是雙向的,因此接收器也可以發送消息)。 在通道的每一端,您都可以在一個端口上進行侦聽,並將消息發送到另一個端口。 通過otherWindow.postMessage()方法發送消息,其中otherWindow是另一個瀏覽上下文。它接受一個消息,一個源和一個端口。 例如: const data = { name: 'Flavio' } const channel = new MessageChannel() window.postMessage(data, [channel.port2]) 消息可以是下列支援的值之一: 所有原始類型,但排除符號 數組 物件文本 字符串,日期,正則表達式對象 Blob,File,FileList對象 ArrayBuffer,ArrayBufferView對象 FormData對象 ImageData對象 Map和Set對象 “源”是一個URI(例如https://example.org)。您可以使用'*'來允許不嚴格的檢查,或指定一個域,或者指定'/'以設置同一域目標,而無需指定所屬域。 其他瀏覽上下文使用message事件來聆聽消息: self.addEventListener('message', event => { console.log('A new message arrived!...

cli-for-beginners

#完全新手的命令行 對於完全新手的命令行使用介紹 電腦很棒,因為使用滑鼠或觸控設備,我們可以做很多工作,鍵盤只需用來打字電子郵件、部落格文章或報告。 很久以前,這種情況並不存在。電腦只能通過鍵盤訪問,輸入奇怪和神秘的指令,稱為命令,這是真實存在的尤其是當電腦體積如整個房間般巨大時,但也適用於第一批價格合理的個人電腦,當你啟動時會跳出一個BASIC命令提示符。 如今,電腦界已將這種方式藏得好好的,消費者根本不會用到。 我們可以使用終端來實現這一點。 macOS自帶一個名為終端的應用程序。 微軟提供了一個名為Windows終端的應用程序。 而Linux用戶對其終端非常熟悉。 終端並不僅僅適用於程序員,對於每個專業電腦用戶來說也是必不可少的,因為它能為你提供無法在GUI(圖形用戶界面)中實現的功能。 哦,我提到了GUI。終端的首字母縮寫是CLI(命令行界面)。 并非只有一個終端。這是你的心願。相反,我們有很多不同的終端界面,稱為shell。 我們有Bash,ZSH,Fish Shell,CSH等等。但最流行的是Bash和ZSH。 Bash通常是默認的終端,直到最近才被更改為ZSH。 老實說,我最喜歡的shell是Fish Shell。我真的很喜歡它,因為它簡單、直接,帶有很好的默認設置,還有一個基於Web的配置。我沒有時間手動配置我的shell提示符和顏色,當某些東西安裝好可以直接用的時候,我會用上它。 終端也是你訪問服務器的方式。你可以在Amazon或DigitalOcean等地創建一個VPS服務器,然後使用SSH(連接到遠程shell的安全協議)來訪問它。 你在本地使用終端,但事實上你可能連接到地球的另一邊的服務器,這真是太酷了。除了一點延遲,如果連接有點滯後。 這是我的macOS終端: 通過輸入ls並按下回車,我可以列出我的主文件夾中的所有文件: 我可以使用cd命令將當前工作目錄更改為其他文件夾: 每次我不知道如何使用一個命令時,我都會輸入man <command>以獲取說明文檔: 這是一個說明文檔。盡管我認為說明文檔包含了太多的信息,比如ls命令的說明就佔用了14屏幕。 大多數時候,我需要時使用了這個網站,叫做tldr頁面:https://tldr.sh/。這是一個你可以安裝的命令,然後像這樣運行它:tldr <command> 它只給了我一些有用的選項和示例。 無論如何,我有點離題了。在輸入命令時,你可以使用左右箭頭來移動光標。 一些系統也允許你使用鼠標移動到行中的特定位置。例如,在macOS上,我可以使用選項-click在我想要的任何位置放置光標。 按上箭頭將顯示你上次輸入過的命令。當你打錯字時,你不需要重新輸入整個命令,這很方便。 如果輸入了一個找不到的命令,shell會告訴你: 我做了一些關於使用shell的教程: 如何使用macOS終端 Bash shell Unix Shells教程 Bash Shell腳本編程入門 如果你想了解更多,那裡有很多閱讀材料!