【问题标题】:Adding a colon (:) to an unsigned char in C++在 C++ 中将冒号 (:) 添加到无符号字符
【发布时间】:2013-04-02 15:20:27
【问题描述】:

我正在编写一个 Arduino 库,用于使用串行馈送在 Arduino 和计算机之间进行简单的数据传输。我已经创建了库等。但是,我在获取 char 数组并向其添加冒号 (':') 时遇到问题。也就是说,

//Sends data via println()
void simpleTransfer::sendData(char *name, char *data){
    char *str = name + ": " + data + ",";
    _serial->println(str); //Sends in form 'name: data,'
}

这应该采用我要发送的变量的名称,添加冒号和空格,以及我要发送的数据,最后是逗号。但是,我反而收到错误消息:

“char*”和“const char [3]”类型的无效操作数到二进制“operator+”

是什么原因?

【问题讨论】:

  • 您正在寻找字符串连接。添加两个指针不会这样做。
  • 感谢大家的帮助

标签: c++ arrays char arduino const-char


【解决方案1】:

简答:使用std::string 创建串联字符串。

 std::string s = ((std::string(name) + ": ") + data) + ",";
_serial->println( s.c_str() );

长答案:当连接 C 风格的字符串时,您需要一个足够大的目标缓冲区来保存结果。如果您知道结果可以达到的最大大小,则可以声明该大小的本地数组,并使用 sprintf 作为其他答案的解释。

或者,如果您事先不知道大小,您可以使用strlennew[] 的组合来分配动态大小的缓冲区,进行打印,然后delete[] 缓冲区。但不要这样做!改用字符串类,std::string,或者正如 Drew Dormann 在下面的 cmets 中提到的那样,一个 Arduino 特定的 String 类。

【讨论】:

  • ...据我所知,Arduino 的 C++ 实现没有标头 <string>,但确实提供了一个类型 String 来支持您编写的语法。如果我错了,请纠正我,任何人。 :)
  • @DrewDormann:哦,我不知道 Arduino 有这个! arduino.cc/en/Reference/StringObject
  • 您真的不想在 Arduino 上使用标准 C++ 库:它是一个资源不足的平台。因此,它有自己的字符串实现。
【解决方案2】:

你可以使用sprintf:

char str[64];  // Or whatever length you need to fit the resulting string
sprintf(str, "%s:%s,", name, data);

strcpy/strcat:

char str[64];
strcpy(str, name);
strcat(str, ":");
strcat(str, data);
strcat(str, ",");


或者只使用 C++ 的 std::string

【讨论】:

  • 与上述评论相同:std::string 不适用于 Arduino。 sprintf 方法更好,但需要引入某些库,这会显着增加代码大小,这在 Arduino 上也是不可取的
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 2013-03-19
  • 2015-12-10
  • 1970-01-01
  • 2020-05-14
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多