Arduino 字符串

2018-11-08 15:55 更新

字符串用于存儲文本。它們可用在LCD或Arduino IDE串口監(jiān)視器窗口中顯示文本。字符串也可用于存儲用戶輸入。例如,用戶在連接到Arduino的鍵盤上鍵入的字符。

在Arduino編程中有兩種類型的字符串:

  • 字符數(shù)組,與C編程中使用的字符串相同。
  • Arduino字符串,它允許我們在草圖中使用字符串對象。

在本章中,我們將學(xué)習(xí)Arduino草圖中的字符串,對象和字符串的使用。在本章末尾,你將學(xué)習(xí)在草圖中使用哪種類型的字符串。

字符串字符數(shù)組

我們要學(xué)習(xí)的第一種類型的字符串是 char 類型的一系列字符。在前面的章節(jié)中,我們學(xué)習(xí)了一個數(shù)組是什么:存儲器中存儲的相同類型的變量的連續(xù)序列。一個字符串是一個char變量的數(shù)組。

字符串是一個特殊的數(shù)組,在字符串的末尾有一個額外的元素,其值總是為0(零)。這被稱為“空終止字符串”。

字符串字符數(shù)組示例

此示例將顯示如何創(chuàng)建字符串并將其打印到串口監(jiān)視器窗口。

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() { 

}

以下示例顯示了字符串由什么組成。一個具有可打印字符的字符數(shù)組和0作為數(shù)組的最后一個元素,表示這是字符串結(jié)束的位置。通過使用 Serial.println()并傳遞字符串的名稱,可以將字符串打印到Arduino IDE串口監(jiān)視器窗口。

同樣的例子可以用更方便的方式編寫,如下所示:

示例

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

在這個草圖中,編譯器計算字符串?dāng)?shù)組的大小,并自動使用空值0終止字符串。一個長度為六個元素長,由五個字符后跟一個零組成的數(shù)組,其創(chuàng)建方式與上一個草圖完全相同。

操作字符串?dāng)?shù)組

我們可以在草圖中更改字符串?dāng)?shù)組,如下圖所示。

例子

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() {

}

結(jié)果

I like coffee and cake
I like coffee
I like coffee and tea

以上草圖按以下方式工作。

(1)創(chuàng)建和打印字符串

在上面給出的草圖中,創(chuàng)建了一個新的字符串,然后打印出來顯示在串口監(jiān)視器窗口中。

(2)縮短字符串

通過用空終止0替換字符串中的第14個字符來縮短字符串。這是從0開始計算的字符串?dāng)?shù)組中的13號元素。

打印字符串時,所有字符都打印到新的空終止0。其他字符不消失;它們?nèi)匀淮嬖谟趦?nèi)存中,并且字符串?dāng)?shù)組仍然是相同的大小。唯一的區(qū)別是任何使用字符串的函數(shù)只能看到第一個空終止符前的字符串。

(3)更改字符串中的單詞

最后,草圖用“tea”代替“cake”一詞。它首先必須用空格替換空終止符,如[13],以便將字符串恢復(fù)為原來的格式。

新字符用單詞“tea”覆蓋單詞“cake”的“cak”。這是通過覆蓋單個字符來完成的。“cake”的“e”被替換為新的空終止字符。結(jié)果是字符串實(shí)際上終止于兩個空字符,即字符串末尾的原始字符,以及替換“cake”中的“e”的新字符。這在打印新字符串時沒有區(qū)別,因?yàn)榇蛴∽址暮瘮?shù)在遇到第一個空終止字符時將停止打印字符串字符。

操作字符串?dāng)?shù)組的函數(shù)

上一個草圖通過訪問字符串中的單個字符,以手動方式操作字符串。為了更方便操作字符串?dāng)?shù)組,你可以編寫自己的函數(shù)來執(zhí)行,也可以使用 C 語言庫中的一些字符串函數(shù)。

下面顯示了操作字符串?dāng)?shù)組的列表函數(shù)。

下一個草圖使用了一些C字符串函數(shù)。

例子

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() {

}

結(jié)果

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

以上草圖按以下方式工作。

(1)打印字符串

最新創(chuàng)建的字符串將打印到串口監(jiān)視器窗口,如之前的草圖所完成的。

(2)獲取字符串的長度

strlen()函數(shù)用于獲取字符串的長度。字符串的長度僅對于可打印字符,不包括空終止符。

該字符串包含17個字符,因此我們在串口監(jiān)視器窗口中看到17個字符。

(3)獲取數(shù)組的長度

運(yùn)算符sizeof()用于獲取包含字符串的數(shù)組的長度。長度包括空終止符,因此長度比字符串的長度多1。

sizeof()看起來像一個函數(shù),但技術(shù)上是一個運(yùn)算符。它不是C字符串庫的一部分,但在草圖中用于顯示數(shù)組大小和字符串大?。ɑ蜃址L度)之間的差異。

(4)復(fù)制字符串

strcpy()函數(shù)用于將str[]字符串復(fù)制到out_num[]數(shù)組。strcpy()函數(shù)將傳遞給它的第二個字符串復(fù)制到第一個字符串中?,F(xiàn)在,字符串的副本存在于out_num[]數(shù)組中,但只占用了數(shù)組的18個元素,因此在數(shù)組中仍然有22個空閑的char元素。這些空閑元素在內(nèi)存中的字符串的后面可以找到。

將字符串復(fù)制到數(shù)組中,以便我們在數(shù)組中有一些額外的空間用于草圖的下一部分,即在字符串的末尾添加一個字符串。

(5)將字符串附加到字符串(連接)

草圖將一個字符串加到另一個字符串,這稱為串聯(lián)。這是使用strcat()函數(shù)完成的。strcat()函數(shù)將傳遞給它的第二個字符串放到傳遞給它的第一個字符串的末尾。

串聯(lián)后,打印字符串的長度以顯示新的字符串長度。然后打印數(shù)組的長度,以顯示在40個元素長的數(shù)組中有一個25個字符長度的字符串。

請記住,25個字符長度的字符串實(shí)際上占用了數(shù)組的26個字符,因?yàn)檫€有空終止0。

數(shù)組邊界

使用字符串和數(shù)組時,在字符串或數(shù)組的邊界內(nèi)工作是非常重要的。在示例草圖中,創(chuàng)建了一個長度為40個字符的數(shù)組,以分配可用于操作字符串的內(nèi)存。

如果數(shù)組太小,而我們嘗試復(fù)制比數(shù)組大的字符串,那么字符串將復(fù)制到超出數(shù)組的末尾。超出數(shù)組末尾的內(nèi)存可能包含草圖中使用的其他重要數(shù)據(jù),然而它們將被字符串覆蓋。如果超出字符串末尾的內(nèi)存超出范圍,則可能會導(dǎo)致草圖崩潰或?qū)е乱馔庑袨椤?/span>

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號