
- Arduino 教程
- Arduino - 首頁
- Arduino - 概述
- Arduino - 開發板說明
- Arduino - 安裝
- Arduino - 程式結構
- Arduino - 資料型別
- Arduino - 變數和常量
- Arduino - 運算子
- Arduino - 控制語句
- Arduino - 迴圈
- Arduino - 函式
- Arduino - 字串
- Arduino - 字串物件
- Arduino - 時間
- Arduino - 陣列
- Arduino 函式庫
- Arduino - I/O 函式
- Arduino - 高階 I/O 函式
- Arduino - 字元函式
- Arduino - 數學庫
- Arduino - 三角函式
- Arduino 高階
- Arduino - Due 和 Zero
- Arduino - 脈衝寬度調製
- Arduino - 隨機數
- Arduino - 中斷
- Arduino - 通訊
- Arduino - 互聯積體電路
- Arduino - 序列外設介面
- Arduino 專案
- Arduino - 閃爍 LED
- Arduino - 漸變 LED
- Arduino - 讀取模擬電壓
- Arduino - LED 條形圖
- Arduino - 鍵盤登出
- Arduino - 鍵盤訊息
- Arduino - 滑鼠按鈕控制
- Arduino - 鍵盤序列埠
- Arduino 感測器
- Arduino - 溼度感測器
- Arduino - 溫度感測器
- Arduino - 水位檢測器/感測器
- Arduino - PIR 感測器
- Arduino - 超聲波感測器
- Arduino - 連線開關
- 電機控制
- Arduino - 直流電機
- Arduino - 伺服電機
- Arduino - 步進電機
- Arduino 和聲音
- Arduino - 音調庫
- Arduino - 無線通訊
- Arduino - 網路通訊
- Arduino 有用資源
- Arduino - 快速指南
- Arduino - 有用資源
- Arduino - 討論
Arduino - 字串
字串用於儲存文字。它們可以用於在 LCD 或 Arduino IDE 序列埠監視器視窗中顯示文字。字串也可用於儲存使用者輸入。例如,使用者在連線到 Arduino 的鍵盤上輸入的字元。
Arduino 程式設計中有兩種型別的字串:
- 字元陣列,與 C 程式設計中使用的字串相同。
- Arduino String,它允許我們在草圖中使用字串物件。
在本章中,我們將學習字串、物件以及字串在 Arduino 草圖中的使用。在本章結束時,您將學習在草圖中使用哪種型別的字串。
字串字元陣列
我們將學習的第一種字串型別是字元序列,其型別為char。在上一章中,我們學習了什麼是陣列;儲存在記憶體中的相同型別變數的連續序列。字串是 char 變數的陣列。
字串是一個特殊的陣列,在其末尾有一個額外的元素,該元素始終值為 0(零)。這稱為“以 null 結尾的字串”。
字串字元陣列示例
此示例將演示如何建立字串並將其列印到序列埠監視器視窗。
示例
void setup() { char my_str[6]; // an array big enough for a 5 character string Serial.begin(9600); my_str[0] = 'H'; // the string consists of 5 characters my_str[1] = 'e'; my_str[2] = 'l'; my_str[3] = 'l'; my_str[4] = 'o'; my_str[5] = 0; // 6th array element is a null terminator Serial.println(my_str); } void loop() { }
以下示例顯示了字串的構成;一個包含可列印字元的字元陣列,以及陣列的最後一個元素為 0,以表示字串在此處結束。可以透過使用Serial.println()並傳遞字串的名稱來將字串列印到 Arduino IDE 序列埠監視器視窗。
此相同的示例可以用更方便的方式編寫,如下所示:
示例
void setup() { char my_str[] = "Hello"; Serial.begin(9600); Serial.println(my_str); } void loop() { }
在此草圖中,編譯器計算字串陣列的大小,並自動以零結束字串。建立了一個長度為六個元素的陣列,該陣列包含五個字元,後跟一個零,這與上一個草圖中的建立方式完全相同。
操作字串陣列
我們可以在草圖中更改字串陣列,如下面的草圖所示。
示例
void setup() { char like[] = "I like coffee and cake"; // create a string Serial.begin(9600); // (1) print the string Serial.println(like); // (2) delete part of the string like[13] = 0; Serial.println(like); // (3) substitute a word into the string like[13] = ' '; // replace the null terminator with a space like[18] = 't'; // insert the new word like[19] = 'e'; like[20] = 'a'; like[21] = 0; // terminate the string Serial.println(like); } void loop() { }
結果
I like coffee and cake I like coffee I like coffee and tea
草圖的工作原理如下。
建立和列印字串
在上面給出的草圖中,建立了一個新的字串,然後打印出來以在序列埠監視器視窗中顯示。
縮短字串
透過將字串中的第 14 個字元替換為 null 終止符零 (2) 來縮短字串。這是從 0 開始計數的字串陣列中的第 13 個元素。
列印字串時,將列印所有字元直至新的 null 終止符。其他字元不會消失;它們仍然存在於記憶體中,並且字串陣列的大小仍然相同。唯一的區別是,任何處理字串的函式都只會看到字串直至第一個 null 終止符。
更改字串中的一個單詞
最後,草圖將單詞“cake”替換為“tea”(3)。它首先必須將 like[13] 處的 null 終止符替換為空格,以便將字串恢復為最初建立的格式。
新字元用單詞“tea”覆蓋單詞“cake”的“cak”。這是透過覆蓋單個字元來完成的。“cake”的“e”被替換為一個新的 null 終止符。結果是字串實際上以兩個 null 字元結束,一個是字串末尾的原始 null 字元,另一個是替換“cake”中“e”的新 null 字元。當列印新字串時,這沒有什麼區別,因為列印字串的函式在遇到第一個 null 終止符時停止列印字串字元。
操作字串陣列的函式
前面的草圖透過訪問字串中的單個字元以手動方式操作字串。為了更輕鬆地操作字串陣列,您可以編寫自己的函式來執行此操作,或者使用C語言庫中的一些字串函式。
下一個草圖使用了一些 C 字串函式。
示例
void setup() { char str[] = "This is my string"; // create a string char out_str[40]; // output from string functions placed here int num; // general purpose integer Serial.begin(9600); // (1) print the string Serial.println(str); // (2) get the length of the string (excludes null terminator) num = strlen(str); Serial.print("String length is: "); Serial.println(num); // (3) get the length of the array (includes null terminator) num = sizeof(str); // sizeof() is not a C string function Serial.print("Size of the array: "); Serial.println(num); // (4) copy a string strcpy(out_str, str); Serial.println(out_str); // (5) add a string to the end of a string (append) strcat(out_str, " sketch."); Serial.println(out_str); num = strlen(out_str); Serial.print("String length is: "); Serial.println(num); num = sizeof(out_str); Serial.print("Size of the array out_str[]: "); Serial.println(num); } void loop() { }
結果
This is my string String length is: 17 Size of the array: 18 This is my string This is my string sketch. String length is: 25 Size of the array out_str[]: 40
草圖的工作原理如下。
列印字串
新建立的字串被列印到序列埠監視器視窗,就像在以前的草圖中一樣。
獲取字串的長度
strlen() 函式用於獲取字串的長度。字串的長度僅針對可列印字元,不包括 null 終止符。
字串包含 17 個字元,因此我們在序列埠監視器視窗中看到列印的 17。
獲取陣列的長度
運算子 sizeof() 用於獲取包含字串的陣列的長度。長度包括空終止符,因此長度比字串長度多一。
sizeof() 看起來像一個函式,但從技術上講是一個運算子。它不是 C 字串庫的一部分,但在草圖中使用它來顯示陣列大小和字串大小(或字串長度)之間的區別。
複製字串
strcpy() 函式用於將 str[] 字串複製到 out_num[] 陣列。strcpy() 函式將傳遞給它的第二個字串複製到第一個字串中。現在 out_num[] 陣列中存在字串的副本,但它只佔用陣列的 18 個元素,因此我們仍然在陣列中擁有 22 個空閒的 char 元素。這些空閒元素位於記憶體中字串之後。
字串被複制到陣列中,以便我們在陣列中有一些額外的空間可以在草圖的下一部分使用,即在字串末尾新增字串。
將字串附加到字串(連線)
草圖將一個字串連線到另一個字串,這被稱為連線。這是使用 strcat() 函式完成的。strcat() 函式將傳遞給它的第二個字串放在傳遞給它的第一個字串的末尾。
連線後,列印字串長度以顯示新的字串長度。然後列印陣列長度以顯示我們在 40 個元素的陣列中有一個 25 個字元長的字串。
請記住,由於空終止零,25 個字元長的字串實際上佔用了陣列的 26 個字元。
陣列邊界
在處理字串和陣列時,務必在字串或陣列的範圍內操作。在示例草圖中,建立了一個 40 個字元長的陣列,以便分配可用於操作字串的記憶體。
如果陣列設定得太小,並且我們嘗試將一個比陣列更大的字串複製到其中,則該字串將被複制到陣列的末尾之外。陣列末尾之外的記憶體可能包含草圖中使用的其他重要資料,這些資料將被我們的字串覆蓋。如果字串末尾之外的記憶體被越界,則可能導致草圖崩潰或出現意外行為。