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 + 运算符,因为很容易导致错误编码。

 

posted @ 2025-01-27 00:29  mcwhirr  阅读(31)  评论(0)    收藏  举报