字符串用于存储文本。 它们可用于在LCD或Arduino IDE串行监视器窗口中显示文本。 字符串也可用于存储用户输入。 例如,用户在键盘上连接到Arduino的字符。
在Arduino编程中有两种类型的字符串:
字符数组,与C编程中使用的字符串相同。
Arduino字符串,它允许我们在草图中使用字符串对象。
在本章中,我们将学习Arduino草图中的字符串,对象和字符串的使用。 在本章结束时,您将学习在草图中使用哪种类型的字符串。
字符串字符数组
我们要学习的第一种类型的字符串是字符串 char 的一系列字符。 在上一章中,我们学习了一个数组是什么; 连续一系列相同类型的变量存储在内存中。 字符串是一个char变量数组。
字符串是一个特殊的数组,在字符串的末尾有一个额外的元素,它总是具有值0(零)。 这被称为“空终止字符串"。
字符串字符数组示例
此示例将显示如何创建字符串并将其打印到串行监视器窗口。
示例
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 Serial Monitor窗口。
这个相同的例子可以以更方便的方式编写,如下所示 -
示例
void setup() { char my_str[] = "Hello"; Serial.begin(9600); Serial.println(my_str); } void loop() { }
在这个草图中,编译器计算字符串数组的大小,并且自动使用null终止字符串。 一个数组是六个元素长,由五个字符后跟一个零,其创建方式与上一个草图完全相同。
操作字符串数组
我们可以在草图中更改字符串数组,如下图所示。
例子
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
草图以下列方式工作。
创建和打印字符串
在上面给出的草图中,创建一个新的字符串,然后打印出来显示在串行监视器窗口中。
缩短字符串
通过用零终止零(2)替换字符串中的第14个字符来缩短字符串。 这是从0开始计算的字符串数组中的元素号13。
打印字符串时,所有字符都打印到新的空终止零。 其他字符不消失; 它们仍然存在于内存中,并且字符串数组仍然是相同的大小。 唯一的区别是任何使用字符串的函数只能看到第一个空终止符。
更改字符串中的单词
最后,草图用“茶"代替“蛋糕"一词(3)。 它首先必须用空格替换空终止符,如[13],以便将字符串恢复为原始创建的格式。
新字符用单词“tea"覆盖单词“cake"的“cak"。 这是通过覆盖单个字符。 “蛋糕"的“e"被替换为新的空结束字符。 结果是字符串实际上以两个空字符终止,原始字符在字符串的末尾,而新字符替换“cake"中的“e"。 这在打印新字符串时没有区别,因为打印字符串的函数在遇到第一个空终止符时停止打印字符串字符。
操纵字符串数组的函数
上一个sketch通过访问字符串中的单个字符以手动方式操作字符串。 为了更容易操作字符串数组,您可以编写自己的函数来执行,也可以使用 C 语言库中的一些字符串函数。
Given below is the list Functions to Manipulate String Arrays
下一个草图使用一些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()函数用于获取字符串的长度。 字符串的长度仅适用于可打印字符,不包括空终止符。
该字符串包含17个字符,因此我们在串行监视器窗口中看到17个字符。
获取数组的长度
运算符sizeof()用于获取包含字符串的数组的长度。 长度包括空终止符,因此长度比字符串的长度多1。
sizeof()看起来像一个函数,但技术上是一个运算符。 它不是C字符串库的一部分,但在草图中用于显示数组大小和字符串大小(或字符串长度)之间的差异。
复制字符串
strcpy()函数用于将str []字符串复制到out_num []数组。 strcpy()函数将传递给它的第二个字符串复制到第一个字符串中。 这个字符串的副本现在存在于out_num []数组中,但只占用了数组的18个元素,因此我们在数组中仍然有22个自由char元素。 这些自由元素在内存中的字符串之后找到。
将字符串复制到数组中,以便我们在数组中有一些额外的空间用于草图的下一部分,这是在字符串的末尾添加一个字符串。
将字符串附加到字符串(连接)
草图将一个字符串连接到另一个字符串,这称为并置。 这是使用strcat()函数完成的。 strcat()函数将传递给它的第二个字符串传递到传递给它的第一个字符串的末尾。
连接后,打印字符串的长度以显示新的字符串长度。 然后打印数组的长度,以显示在40个元素长的数组中有一个25个字符长的字符串。
请记住,25个字符的长字符串实际上占用了26个字符的数组,因为null终止零。
数组边界
当使用字符串和数组时,在字符串或数组的边界内工作是非常重要的。 在示例草图中,创建了一个长度为40个字符的数组,以分配可用于处理字符串的内存。
如果数组太小,我们试图复制一个大于数组的字符串,那么字符串将复制到数组的末尾。 超出数组末尾的内存可能包含草图中使用的其他重要数据,然后将被我们的字符串覆盖。 如果超出字符串末尾的内存溢出,它可能会导致草图崩溃或导致意外行为。