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 個字元長的陣列,以便分配可用於操作字串的記憶體。

如果陣列設定得太小,並且我們嘗試將一個比陣列更大的字串複製到其中,則該字串將被複制到陣列的末尾之外。陣列末尾之外的記憶體可能包含草圖中使用的其他重要資料,這些資料將被我們的字串覆蓋。如果字串末尾之外的記憶體被越界,則可能導致草圖崩潰或出現意外行為。

廣告