【问题标题】:Arduino: String join?Arduino:字符串连接?
【发布时间】:2011-04-25 18:16:33
【问题描述】:

我正在尝试为 Arduino 编写 join 方法:

#define ARG_DELIMITER ','

  String join(const String strs[], const int len) {
    String result = "";
    for (int i = 0; i < len; i++) {
      result += strs[i] + ARG_DELIMITER;
      Serial.println(result);
    }
    return result.substring(0, result.length() - 1);
  }

loop()中的调用代码:

const String args[3] = {"foo", "bar", "baz"};
Serial.println(SlaveTalk.join(args, 3));

这将打印以下内容:

foo
foo
foo
fo

只要程序运行,后跟空字符串。

我在这里做错了什么?

【问题讨论】:

  • 可能更重要的是,String 类/类型是什么?
  • @Michael - String 类似乎已定义为 here
  • 从 C++ 角度接近此问题的人可能会感兴趣的另一个细节:“Arduino 语言基于 C/C++”(来自 arduino.cc/en/Reference/HomePage)。所以它类似于但不完全是 C++。

标签: c++ string arduino


【解决方案1】:

这一行

const String args[3] = {"foo", "bar", "baz"};

给你字符串

"foo\0" "bar\0" "baz\0"

其中 \0 是 NULL 字符。所以当你连接时,我希望你最终得到:

"foo\0bar\0baz\0"

打印在 null 处停止,这就是您看到 foo 3 次的原因。在 return 语句中,长度为 3 "foo",减去 1 得到 "fo"

【讨论】:

【解决方案2】:

以下代码使用 Arduino 软件版本 0022 和带有 ATmega 328 的 Arduino Duemilanove 按预期工作:

#define ARG_DELIMITER ','

class SlaveTalkClass
{
  public:
    String join(const String strs[], const int len) {
      String result = "";
      for (int i = 0; i < len; i++) {
        result += strs[i] + ARG_DELIMITER;
        Serial.println(result);
      }
      return result.substring(0, result.length() - 1);
    }
} SlaveTalk;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  const String args[3] = {"foo", "bar", "baz"};
  Serial.println(SlaveTalk.join(args, 3));
}

它反复向串行监视器打印以下内容:

foo,
foo,bar,
foo,bar,baz,
foo,bar,baz

【讨论】:

    【解决方案3】:

    PString 是一个优秀的库,可以连接。它有一些简洁的功能,最重要的是,它是运行时安全的。

    【讨论】:

    • 展示你如何在实际任务中使用 PString,添加一些示例代码!
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多