Извлечение последовательности всей строки (Arduino, C ++, indexOf, подстрока) - PullRequest
0 голосов
/ 26 марта 2020

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

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

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

Это то, что у меня пока есть:

  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);

Спасибо :))

nolimits

1 Ответ

1 голос
/ 26 марта 2020

Ввод:

"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

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

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);

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

...