arduino简单string入门——Arduino 字符串中的错误
这两个字符串语句可能会导致崩溃/重启
已知有两种情况,使用 Arduino 字符串可能会导致您的主板重新启动/崩溃,这是由于 Arduino 提供的当前 Wstring.cpp 中的错误造成的。它们是:-
str += str; // 将字符串连接到自身
和
String(1.0, 32); // 或在任何小数位数 + 整数位数 >31 的情况下
避免第一种情况,并限制第二种情况下大浮点数的小数位数。SafeString库版本是安全的。
此 版本的 WString.cpp和此版本的 WString.h修复了这些错误。只需将其复制到 arduino ...\hardware\arduino\avr\cores 目录 中的 WString.cpp 和 Wstring.h 以及 Stream.cpp 上即可。Arduino
的未来版本将使用包含这两个问题修复的 ArduinoCore-API 代码库。
给出错误结果的字符串语句
在字符串中间添加 '\0' 字符会导致比较失败。例如
String str; str = "a"; str += '\0'; str += "text"; Serial.print(F("str is '"));Serial.print(str); Serial.println("'"); if (str != "a text") { Serial.println("Did not match 'a text'"); }
输出
str is 'a text' Did not match 'a text'
当到达嵌入的‘\0’时,字符串比较操作停止。
数字转换方法 Arduino String toInt()可能会产生奇怪的错误,但这是由于底层 c 字符串方法造成的,无法轻易修复。例如
String a_str("123456789012345"); Serial.println(a_str.toInt()); Outputs -2045911175 and String a_str("5.95"); OR String a_str("5a"); Serial.println(a_str.toInt()); Outputs 5
尽管有些程序员并不认为这是一个错误。
字符串语句未按预期工作
if ("text" == str) { // ... }
给出编译错误 error : 没有匹配“operator==” (操作数类型为“const char [5]”和“String”)
更改语句以修复编译错误。
这是由于 C++ 中 == 运算符的工作方式导致的。它无法修复。字符串需要位于逻辑运算符的左侧。
类似地,当尝试使用字符串 + 运算符时,运算符左侧必须有一个字符串。
String str = "abc" + 2; Serial.println(str); String abcStr = "abc"; str = str1 + 2; Serial.println(str); Outputs c abc2
这是由于 C 索引 char* 的方式造成的。“abc”+2 的结果是将指向“abc”的指针加 2,然后指向“c”。使用
“abc”+i这样的语句很容易使你的程序崩溃
正如本页顶部所述,不要使用 String + 运算符,因为很容易导致错误编码。