Поиск в массиве

Тема в разделе "Флудилка", создана пользователем issaom, 14 апр 2025.

  1. issaom

    issaom Гуру

    Есть такая строка:

    Код (C++):
    char str[] = "PRIVET_#BEGtestik#END_GOODBY";
    Из этой строки мне нужно ПОБАЙТНО обратится к содержимое между
    #BEG и #END

    В Сях я совсем не разбираюсь. Получилось, что такое и оно вроде как даже работает.

    Код (C++):
    void setup() {
      Serial.begin(115200);
     
      char str[] = "PRIVET_#BEGtestik#END_GOODBY";
     
      char *ptr_beg; // Указатель на начало
      char *ptr_end; // Указатель на конец

      ptr_beg = strstr (str, "#BEG");
      ptr_end = strstr (str, "#END");


      if (ptr_beg == NULL) {
        Serial.println("не найдено начало"); return;
        }


      if (ptr_end == NULL) {
        Serial.println("не найден конец"); return;
        }

      ptr_beg+=4;

      for (ptr_beg; ptr_beg < ptr_end; ptr_beg++) {
      Serial.println(*ptr_beg);
      }


    }

    void loop() {


    }
    Так можно сделать или это криво совсем?
     
  2. parovoZZ

    parovoZZ Гуру

    кажется, это кривовато. На обычных ASCII кодировках это будет работать, на UTF будут сюрпризы.
     
  3. issaom

    issaom Гуру

    Про UTF я в курсе, если в массиве между #BEG.....#END будут русские буквы, там будет отдельный обработчик. В рамках данной задачи считаем, что использование кириллицы в строке не предполагаетЦО
     
  4. issaom

    issaom Гуру

    Да и вообще с Кирилицей в Ардуине проблем нет - она там все за тебя делает )))

    Код (C++):
    void setup() {
      Serial.begin(115200);
     
      char str[] = "PRIVET_#BEGtest_привет_мир!#END_GOODBY";
     
      char *ptr_beg; // Указатель на начало
      char *ptr_end; // Указатель на конец

      ptr_beg = strstr (str, "#BEG");
      ptr_end = strstr (str, "#END");


      if (ptr_beg == NULL) {
        Serial.println("не найдено начало"); return;
        }


      if (ptr_end == NULL) {
        Serial.println("не найден конец"); return;
        }

      ptr_beg+=4;

      String S;
      for (ptr_beg; ptr_beg < ptr_end; ptr_beg++) {
      char s = *ptr_beg;
      S += s;
      }

      Serial.println(S);

    }

    void loop() {


    }
     
  5. parovoZZ

    parovoZZ Гуру

    вообще, строка
    сдвигает указатель на 4 char элемента вправо и делает это жёстко. Если вместо
    будет Unicode с двумя байтами на символ, то будет сюрприз. Поэтому все длины я отдаю на откуп компилятору (или препроцессору) - им виднее, что там да как.
     
  6. issaom

    issaom Гуру

    Кому может прийти в голову придет использовать кириллицу в служебных целях - это изврат какой-то )))
     
  7. Asper Daffy

    Asper Daffy Иксперд

    Вы сюда поспорить пришли? Или ответ получить? Может, вместо спора, продуктивнее спросить, а как это сделать с наименьшими усилиями? Получить ответ, что для исключения проблем, достаточно вместо
    Код (Text):
    ptr_beg += 4;
    написать
    Код (Text):
    ptr_beg += sizeof("#BEG") - 1;
    и получить новое знание? Или поспорить приятнее?

    Я вот хотел ещё несколько замечаний сделать, но что-то расхотелось. Бить пальцы об клавиши, чтобы Вы меня так же как паровоза послали и стали доказывать, что у Вас и так всё хорошо? Оно мне надо? У Вас всё хорошо, не возражаю.
     
    issaom нравится это.
  8. issaom

    issaom Гуру

    За новое знание конечно спасибо, только в конечной программе планируется использование около 40 разных подобных идентификаторов (что-типа самодельного макроязыка) и мне проще их сделать стандартной длинны и уж точно без кириллицы....

    Все что меня интересовало - как правильно сделать поиск в ЭТОЙ КОНКРЕТНОЙ СТРОКЕ?

    Не будет у меня в этой строке ничего кроме assi кодировки - так зачем мне знания к теме вопроса не относящиеся?

    Мне нужен был либо кусок кода, либо совет какой погуглить оператор или, а не как использовать символы, использование которых не предполагается.
     
  9. parovoZZ

    parovoZZ Гуру

    Обо всём об этом мы узнали только сейчас, ибо вопрос был поставлен так (сразу после простыни с кодом):
    с точки зрения машины, символы в строке не делятся на извращённые и не извращённые. Я уже показывал, что если научится владеть инструментом, то работать можно с чем угодно.
    Сложность при работе с обычными ASCII кодировками только лишь одна - можно использовать только английский и ещё какой-то, но один, язык. Хочешь третий язык - придётся переключить ASCII таблицу. Хочешь смайлики - переключись ещё на одну.