【问题标题】:Problems comparing strings (arduino)比较字符串的问题(arduino)
【发布时间】:2019-01-26 22:16:21
【问题描述】:

我在比较字符串时遇到问题。

我从mqtt收到了一些消息,我想为每个主题(key)存储最新的值

我已经展示了我草图的相关部分。

#define MAX_SENSORS 6

//主题和价值表

char sensor_data[MAX_SENSORS][2][20]; 

初始化表

void init() {
....
  for (int i=0;i<MAX_SENSORS;i++) // initialize table
  {
    strcpy(sensor_data[i][0],"?");
    strcpy(sensor_data[i][1],"");
  }

}

在这里收到消息

void callback(char* topic, byte* b_payload, unsigned int length) {
  // Convert byte* b_payload to string
  for (int i = 0; i < length; i++) {
    payload[i]=(char)b_payload[i];
  };
  payload[length]='\0';

  for (int i = 0; i < MAX_SENSORS; i++)
  {

为什么这个(独立调试)不起作用?

    if (sensor_data[i][0]=="?") { 
      Serial.print("*");
    }

原创

    if (sensor_data[i][0]==topic) { // Slot matching topic found
      strcpy(sensor_data[i][1],payload);
      Serial.printf(" Slot %d",i); 
      break;
    } else if (sensor_data[i][0]=="?") {  // Empty slot found, store topic here
      strcpy(sensor_data[i][0],topic);
      strcpy(sensor_data[i][1],payload);
      Serial.printf(" New  %d",i); 
      break;
    } 
  }
  Serial.println();
}

这一切可能源于我对字符串和字符数组感到困惑?

编辑 任务

  strcpy(sensor_data[i][0],topic);
  strcpy(sensor_data[i][1],payload);

似乎分配了

concat(topic,payload) to sensor_data[i][0].

【问题讨论】:

  • 您可以检查字符是否为'?',使用字符文字:sensor_data[i][0][0]=='?',但稍后可能会有一些非'\0'字符。并检查它是否为空字符串,您可以if ( sensor_data[i][0][0]=='\0' ) {}
  • topic 是否超过 19 个字符?
  • 该死,你是对的。

标签: c++ string arduino


【解决方案1】:

这一切可能源于我对字符串和 字符数组?

好像是这样。 C 字符串(char* 和 char[])与 == 不可比,arduino 的 String 类是。将比较的左侧转换为String 或使用strcmp 比较字符串。

if (String(sensor_data[i][0])=="?") { 
if (strcmp(sensor_data[i][0], "?") == 0) { 

【讨论】:

  • 第一个给出错误“'operator=='不匹配(操作数类型是'char [20]'和'String')”
  • 这很有趣,我预计 char* 会过载。好吧,然后将双方都转换为String。
  • 实际上,它确实为 char* 重载,但不幸的是仅在右侧。所以比较的左边一定是String
  • 好的,"if (strcmp(sensor_data[i][0], "?") == 0) { " 有效。
  • 但是strcpy(sensor_data[i][0],topic)有问题; strcpy(sensor_data[i][1],payload);,见上面的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2019-05-04
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多