如何在Arduino中将字符串除以另一个字符串?

时间:2019-02-22 08:55:42

标签: c++ arduino embedded c-strings

我有一个如下的字符数组:

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

如何在Arduino中通过字符串"..."拆分此数组?我尝试过:

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

,输出如下:

AAAA,
 A1,
 3,
 B1

但我实际上希望输出为

AAAA,
A1,
3.B1.

如何获得此输出?

编辑:

我的完整代码是这样:

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 :(得分:3)

主要问题是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;
}

答案 1 :(得分:0)

除了第二个参数的作用之外,您还可以将自己的 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不仅...在这种情况下

答案 2 :(得分:0)

因为您将其标记为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的练习(如果需要)。