Извлечение последовательности целой строки (Arduino, C++, indexOf, подстрока)

Я хотел бы извлечь произвольную часть всей строки и опубликовать ее с помощью Serial.println().

Исходная проблема, с которой я сталкиваюсь, заключается в том, что строковые значения (A, B, C) являются переменными и, следовательно, "неизвестны". Он путается с определенными терминаторами "-" и "END $". Я не могу найти подходящие точки привязки для получения именно той части строки, которую я хочу. Могу, если этих строковых значений нет: "curD = 'Data: String1 A'" vs. "curD = 'String1'". Я хотел бы иметь только "String1 A", "String2 B" или "String3 C".

Примеры A, B, C представляют собой либо целое число, число с плавающей запятой, либо строку переменной/случайной длины.

Это то, что у меня есть до сих пор:

  char headComputerData[] = "String1 - "; // test; can be String1 -, String2 - etc, to get the next adjacent string sequence till " -"
  //char headComputerData[] = "Computer Data: "; // the prefix of the data value
  char dashTerminator[] = " -";     // one possible suffix of a value
  char dollarTerminator[] = " END $ ";   // the other possible suffix of a value
  int firstIndexComputerData;     // index into inputStringPC of the first char of the value

  String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";


      firstIndexComputerData = inputStringPC.indexOf(headComputerData);
      firstIndexComputerData += strlen(headComputerData); // firstIndex is now the index of the char just past the head.
      String compData = inputStringPC.substring// string everything between 
      (
      firstIndexComputerData, //first index
      inputStringPC.indexOf(dashTerminator, firstIndexComputerData) //last index (relative)
      );

      Serial.println(compData);

Спасибо :)

без ограничений


person nolimits    schedule 25.03.2020    source источник
comment
Я не могу найти подходящие опорные точки для извлечения именно той части строки, которая мне нужна. – В этом суть проблемы? Если да, то не могли бы вы удалить все, что не относится к вопросу, и оставить в программе только короткий пример с этим? Я уверен, что в этом случае все быстро уладится.   -  person Ted Lyngmo    schedule 26.03.2020
comment
Спасибо, я удалил ненужные строки кода.   -  person nolimits    schedule 26.03.2020
comment
Хороший! Попробуйте сделать минимально воспроизводимый пример проблемы. Возьмите один простой случай, который вы не можете решить, и жестко закодируйте его в примере. В таком примере Serial.println() не место. Просто разберитесь с проблемой.   -  person Ted Lyngmo    schedule 26.03.2020


Ответы (1)


Вход:

"Computer Data: String1 A - String2 B - String3 C END $ "<br>
         0     1       2 3 4       5 6 7       8 9   10

Вывод должен быть

 String1 A
 String2 B
 String3 C

Если это правильно, почему бы не использовать разделитель пробелов - при условии, что ввод всегда имеет один и тот же формат (см. Выше), поэтому вы можете фильтровать следующим образом:

uint8_t spaceIndex [11] = {};   // we store 10 values + 0 terminator
String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";
for (uint8_t i = 0; i<10; i++){  // we read 10 space delimiter indices into an array
       if (i != 0) spaceIndex[i] = inputStringPC.indexOf(' ', spaceIndex[i-1] );
        else spaceIndex[i] = inputStringPC.indexOf(' ');
  }
  // Extract the relevant data as strings (indexStart + 1 / indexEnd - 1)
  String Astring = inputStringPC.substring (spaceIndex[1] + 1, spaceIndex[3] -1);
  String Bstring = inputStringPC.substring (spaceIndex[4] + 1, spaceIndex[6] -1);
  String Cstring = inputStringPC.substring (spaceIndex[7] + 1, spaceIndex[9] -1);

Это должно дать результат, если я правильно интерпретировал ваш вопрос.
Совет: избавьтесь от класса строк в Arsuino и работайте с массивами символов. Принцип остается прежним.

person Codebreaker007    schedule 26.03.2020
comment
Если это помогло, отметьте как решенное, если нет, дайте отзыв, что не так - person Codebreaker007; 26.03.2020