простой способ разбить строку на основе разделителя в Arduino - PullRequest
0 голосов
/ 06 марта 2020

У меня есть строка, и я хочу разделить ее на основе | так что я могу вызвать эту часть, если мне нужно, пожалуйста, проверьте пример ниже

String test= "first|Second|third";

так как я могу использовать как

string1="first";

string2="second";

string3="third";

или слово [0] , слово [1], слово [2]

я не знаю, что попробовать, потому что я новичок в Arduino

в php я бы сделал так: взорваться ("|", тест ) так что я надеюсь, что мой вопрос ясен

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Arduino имеет очень ограниченные ресурсы, и C строки намного лучше в этой среде. Если вам не нужно сохранять оригинал, я обычно изменяю эту строку.

char **split(char **argv, int *argc, char *string, const char delimiter, int allowempty)
{
    *argc = 0;
    do
    {
        if(*string && (*string != delimiter || allowempty))
        {
            argv[(*argc)++] = string;
        }
        while(*string && *string != delimiter) string++;
        if(*string) *string++ = 0;
        if(!allowempty) 
            while(*string && *string == delimiter) string++;
    }while(*string);
    return argv;
}

int main()
{
    char str[] = "first||Second|||third";
    char str1[] = "first||Second|||third";
    char *argv[8];
    int argc;

    split(argv, &argc, str, '|', 0);
    for(int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
    printf("-----------------\n");
    split(argv, &argc, str1, '|', 1);
    for(int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);
}
0 голосов
/ 06 марта 2020

Я протестировал следующий код на моем Arduino, и он работает. Вам нужно будет изменить его в соответствии с вашими потребностями.

Я бы посоветовал не использовать библиотеку Arduino String, поскольку она использует динамическую память c и может непредсказуемо обработать программы sh, поскольку их недостаточно памяти или из-за фрагментации памяти. Буферы фиксированного размера определенно лучше на микроконтроллере с оперативной памятью всего 2 КБ.

void setup()
{
  Serial.begin(9600);
  int i;
  char delimiter[] = "|";
  char *p;
  char string[128];
  String test = "first|Second|third";
  String words[3];

  test.toCharArray(string, sizeof(string));
  i = 0;
  p = strtok(string, delimiter);
  while(p && i < 3)
  {
    words[i] = p;
    p = strtok(NULL, delimiter);
    ++i;
  }

  for(i = 0; i < 3; ++i)
  {
    Serial.println(words[i]);
  }
}

void loop() {
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...