Типы строк. Нужна помощь с конвертацией.

Стрит_Ежик
Offline
Зарегистрирован: 23.03.2022

Добрый день! Не могу разобраться как правильно конвертировать разные типы строк. Есть такой кусок кода:

bool receivePacket() {
    if (moduleMode != MASTER){
      int len = udp.read(buf, 255);
      if (len > 0)
        buf[len] = '\0';
      Serial.print("Packet received: ");
      Serial.println(buf);
      JSONVar myObject = JSON.parse(buf);
      if(myObject.length()){
        Serial.println((const char*)myObject[0]);
        if((const char*)myObject[0] == "/pattern"){
          Serial.println("OKOKOKO!!!");
          setPattern((int)myObject[1]);
        }
      }
      return true;
    }
    else
      return false;
}

Проблема заключается в том, что не выполняется условие if((const char*)myObject[0] == "/pattern")

Результат выполнения кода из монитора:

Packet received: ["/pattern", 28]
/pattern

То есть (const char*)myObject[0] в монитор выводит /pattern, но условие почему-то не выполняется. Подскажите, в каком моменте я ошибаюсь?

rkit
Offline
Зарегистрирован: 23.11.2016

В том, что пытаешься программировать, не умея читать язык?

Стрит_Ежик
Offline
Зарегистрирован: 23.03.2022

rkit пишет:

В том, что пытаешься программировать, не умея читать язык?

Я топик в разделе для новичков вроде как создавал, нет? Не знаете как помочь или нет желания - пройдите мимо. 

rkit
Offline
Зарегистрирован: 23.11.2016

ты путаешь раздел для новичков с разделом для лентяев

Стрит_Ежик
Offline
Зарегистрирован: 23.03.2022

rkit пишет:

ты путаешь раздел для новичков с разделом для лентяев

Мужичок, сходи на улицу прогуляйся. Пусть интернет отдохнёт чуть-чуть от твоего важного, но не нужного мнения.

b707
Offline
Зарегистрирован: 26.05.2017

Стрит_Ежик пишет:

Проблема заключается в том, что не выполняется условие if((const char*)myObject[0] == "/pattern")

 Подскажите, в каком моменте я ошибаюсь?

переменная типа const char* это указатель на массив, массивы нельзя сравнивать оператором "=="

Их надо сравнивать либо поэлементно, либо, в случае строк - использовать специальные функции из библиотеки strings - к примеру strcmp()

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

научись отличать строковый литерал и указатель на него.  Зачитай чонить за strcmp(), лучше вслух, взобравшись на табуретку. 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

научись отличать строковый литерал и указатель на него.

ага, был неточен, поправил выше про указатель

Стрит_Ежик
Offline
Зарегистрирован: 23.03.2022

b707 пишет:

 

переменная типа const char* это указатель на массив, массивы нельзя сравнивать оператором "=="

Их надо сравнивать либо поэлементно, либо, в случае строк - использовать специальные функции из библиотеки strings - к примеру strcmp()

 

Благодарю Вас! Заработало!

      const char *path = "/pattern";
      if(myObject.length()){
        if(strcmp((const char*)myObject[0], path) == 0){

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

strcmp() вроде как не имеет отношения к string, оно из «штатного комплекта», не?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вообще-то про string никто и не говорил.

В Си строкой принято считать char*, и есть заголовочный файл string.h.

В Си++ в качестве строки обычно рассматривается тип string.

В Ардуино часто используется собственный тип String.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Потёрли то сообщение.

kakaxi
Offline
Зарегистрирован: 20.07.2021

[引用=德西门]

学习区分字符串文本和指向它的指针。读出strcmp(),最好是大声朗读,爬在凳子上。

 

[/引用]

Научитесь отличать текст строки от указателя, указывающего на него.