Как разделить строку на другую строку в Arduino? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть массив символов, как показано ниже:

char array[] = "AAAA... A1... 3. B1.";

Как я могу разделить этот массив по строке "..." в Arduino?Я попытался:

ptr = strtok(array, "...");

и вывод выглядит следующим образом:

AAAA,
 A1,
 3,
 B1

Но я на самом деле хочу, чтобы вывод был

AAAA,
A1,
3.B1.

Как получить этот вывод?

edit:

Мой полный код такой:

char array[] = "AAAA... A1... 3. B1.";
char *strings[10];
char *ptr = NULL;`enter code here` 

void setup()
{
       Serial.begin(9600);

       byte index = 0;
       ptr = strtok(array, "...");  // takes a list of delimiters
       while(ptr != NULL)
       {
            strings[index] = ptr;
            index++;
            ptr = strtok(NULL, "...");  // takes a list of delimiters
       }

       for(int n = 0; n < index; n++)
       {
          Serial.println(strings[n]);
       }
    }

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Основная проблема в том, что strtok не не находит строку внутри другой строки.strtok ищет символ в строке.Когда вы даете несколько символов strtok, он ищет любой из них.Следовательно, запись strtok(array, "..."); точно такая же, как запись strtok(array, ".");.Вот почему вы получаете разделение после «3».

Есть несколько способов сделать то, что вы хотите.Ниже я покажу вам пример использования strstr.В отличие от strtok функция strstr находит подстроку внутри строки - именно то, что вы ищете.Но .. strstr не является токенизатором, поэтому для печати подстрок необходим дополнительный код.

Что-то вроде этого должно сделать:

int main()
{
  char array[] = "AAAA... A1... 3. B1...";

  char* ps = array;
  char* pf = strstr(ps, "..."); // Find first substring
  while(pf)
  {
    int len = pf - ps;          // Number of chars to print
    printf("%.*s\n", len, ps);
    ps = pf + 3;
    pf = strstr(ps, "...");     // Find next substring
  }
  return 0;
}
0 голосов
/ 23 февраля 2019

Поскольку вы пометили это как c ++, вот «версия» вашего кода на c ++:

#include <iostream>
using std::cout;
using std::endl; 

#include <vector>
using std::vector;

#include <string>
using std::string;


class T965_t
{
   string         array;
   vector<string> strings;

public:
   T965_t() : array("AAAA... A1... 3. B1.") 
      {
         strings.reserve(10);
      }

   ~T965_t() = default;

   int operator()() { return setup(); } // functor entry

private: // methods

   int setup()
      {
         cout << endl;
         const string pat1 ("... ");
         string s1 = array; // working copy

         size_t indx = s1.find(pat1, 0); // find first ... pattern
         // start search at ---------^
         do
         {
            if (string::npos == indx)  // pattern not found
            {
               strings.push_back (s1); // capture 'remainder' of s1
               break;                  // not found, kick out
            }

            // else 
            // extract --------vvvvvvvvvvvvvvvvv
            strings.push_back (s1.substr(0, indx));  // capture
            // capture to vector

            indx += pat1.size(); // i.e. 4

            s1.erase(0, indx); // erase previous capture 

            indx = s1.find(pat1, 0);          // find next

         } while(true);

         for(uint n = 0; n < strings.size(); n++)
            cout << strings[n] << "\n";

         cout << endl;
         return 0;
      }

}; // class T965_t

int main(int , char**) { return T965_t()(); } // call functor

С выводом:

AAAA
A1
3. B1.

Примечание: я оставляю изменение «3.B1 «.на «3.B1.» и добавление запятых в конце каждой строки (кроме последней) в качестве упражнения для OP, если требуется.

0 голосов
/ 22 февраля 2019

Вы можете реализовать свой собственный split как strtok , за исключением роли второго аргумента:

#include <stdio.h>
#include <string.h>

char * split(char *str, const char * delim)
{
  static char * s;
  char * p, * r;

  if (str != NULL)
    s = str;

  p = strstr(s, delim);

  if (p == NULL) {
    if (*s == 0)
      return NULL;

    r = s;
    s += strlen(s);
    return r;
  }

  r = s;
  *p = 0;
  s = p + strlen(delim);

  return r;
}

int main()
{
  char s[] = "AAAA... A1... 3. B1.";
  char * p = s;
  char * t;

  while ((t = split(p, "...")) != NULL) {
    printf("'%s'\n", t);
    p = NULL;
  }

  return 0;
}

Компиляция и выполнение:

/tmp % gcc -g -pedantic -Wextra s.c
/tmp % ./a.out
'AAAA'
' A1'
' 3. B1.'
/tmp % 

Я печатаю между '', чтобы показать пробелы, потому что я не уверен, что вы хотите их, поэтому delim - это не только ... в этом случае

...