📅  最后修改于: 2020-11-05 03:29:36             🧑  作者: Mango
字符串用于存储文本。它们可用于在LCD或Arduino IDE串行监视器窗口中显示文本。字符串对于存储用户输入也很有用。例如,用户在连接到Arduino的键盘上键入的字符。
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串行监视器窗口。
可以以更方便的方式编写相同的示例,如下所示-
例
void setup() {
char my_str[] = "Hello";
Serial.begin(9600);
Serial.println(my_str);
}
void loop() {
}
在此草图中,编译器计算字符串数组的大小,并自动将字符串以零终止,以null结束。长度为6个元素,由5个字符和一个零组成的数组的创建方式与上一草图完全相同。
我们可以更改草图中的字符串数组,如下图所示。
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个字符替换为以零结尾的零(2),可以缩短字符串。这是从0开始计数的字符串数组中的元素编号13。
当打印字符串,所有字符都将打印到新的以零结尾的null。其他字符不会消失;它们仍然存在于内存中,并且字符串数组的大小仍然相同。唯一的区别是,任何与字符串一起使用的函数都只会看到直到第一个空终止符的字符串。
最后,草图将“ cake”一词替换为“ tea”(茶)(3)。它首先必须用空格替换like [13]处的空终止符,以便将字符串恢复为最初创建的格式。
新字符用单词“ tea”覆盖单词“ cake”的“ cak”。这是通过覆盖单个字符来完成的。 “ cake”的“ e”被替换为新的空终止字符。结果是该字符串实际上以两个空字符结尾,原始字符在字符串末尾,而新字符替换“ cake”中的“ e”。当打印新字符串时,这没有区别,因为打印字符串的函数在遇到第一个空终止符时将停止打印字符串字符。
先前的草图通过访问字符串中的各个字符以手动方式操作了字符串。为了使操作字符串数组更加容易,您可以编写自己的函数来执行此操作,或者使用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()函数用于获取字符串的长度。字符串的长度仅适用于可打印的字符,不包含空终止符。
该字符串包含17个字符,因此我们在串行监视器窗口中看到17个字符。
运算符sizeof()用于获取包含字符串的数组的长度。该长度包括空终止符,因此该长度比字符串的长度大一。
sizeof()看起来像一个函数,但从技术上讲是一个运算符。它不是C字符串库的一部分,但在草图中用于显示数组大小和字符串大小(或字符串长度)之间的差异。
strcpy()函数用于将str []字符串复制到out_num []数组。 strcpy()函数将传递给它的第二个字符串复制到第一个字符串。现在,out_num []数组中存在该字符串的副本,但是仅占用该数组的18个元素,因此我们在数组中仍然有22个空闲的char元素。这些空闲元素可在内存中的字符串之后找到。
字符串已复制到数组中,以便在数组的下一部分中使用数组中的额外空间,这是在字符串的末尾添加一个字符串。
草图将一个字符串连接到另一个字符串,这称为串联。这是使用strcat()函数的。 strcat()函数将传递给它的第二个字符串放在传递给它的第一个字符串的末尾。
级联后,将字符串的长度被印刷以显示新的字符串长度。然后打印数组的长度,以显示在40个元素长的数组中有25个字符长的字符串。
请记住,由于空字符以零结尾,所以25个字符长的字符串实际上占用了数组的26个字符。
在处理字符串和数组时,在字符串或数组的范围内工作非常重要。在示例草图中,创建了一个数组,该数组长40个字符,以便分配可用于操作字符串的内存。
如果阵列太小,我们试图复制一个字符串,它是比数组给它更大,该字符串在数组的结尾被复制。数组末尾以外的内存可能包含草图中使用的其他重要数据,然后这些数据将被我们的字符串覆盖。如果超出字符串末尾的内存已溢出,则可能使草图崩溃或导致意外行为。