C++ 在arduino中基于分隔符拆分字符串的简单方法

C++ 在arduino中基于分隔符拆分字符串的简单方法,c++,c,lua,arduino,C++,C,Lua,Arduino,我有一个字符串,我想根据|分割它,因此如果需要,我可以调用该部分,请检查下面的示例 String test= "first|Second|third"; 那我怎么用like呢 或字[0],字[1],字[2] 我不知道该尝试什么,因为我是新来的 在php中,我会这样做:explode(“|”,test) 所以我希望我的问题是清楚的我在我的Arduino上测试了下面的代码,它运行正常。您需要修改它以满足您的需要 我建议不要使用Arduino字符串库,因为它使用动态内存,可能会导致程序意外崩溃,因为

我有一个字符串,我想根据|分割它,因此如果需要,我可以调用该部分,请检查下面的示例

String test= "first|Second|third";
那我怎么用like呢

或字[0],字[1],字[2]

我不知道该尝试什么,因为我是新来的

在php中,我会这样做:explode(“|”,test)
所以我希望我的问题是清楚的

我在我的Arduino上测试了下面的代码,它运行正常。您需要修改它以满足您的需要

我建议不要使用Arduino字符串库,因为它使用动态内存,可能会导致程序意外崩溃,因为内存不足或内存碎片。在只有2K内存的微控制器上,固定大小的缓冲区肯定更好

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() {
}
void setup()
{
Serial.begin(9600);
int i;
字符分隔符[]=“|”;
char*p;
字符串[128];
字符串测试=“第一次|第二次|第三次”;
字符串[3];
test.toCharArray(string,sizeof(string));
i=0;
p=strtok(字符串,分隔符);
而(p&i<3)
{
字[i]=p;
p=strtok(空,分隔符);
++一,;
}
对于(i=0;i<3;++i)
{
连续打印(文字[i]);
}
}
void循环(){
}

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]);
}
char**split(char**argv,int*argc,char*string,const char分隔符,int allowempty)
{
*argc=0;
做
{
if(*string&&(*string!=分隔符| | allowempty))
{
argv[(*argc)+]=字符串;
}
而(*string&&*string!=分隔符)string++;
如果(*字符串)*字符串+++=0;
如果(!allowempty)
而(*string&&*string==分隔符)string++;
}while(*字符串);
返回argv;
}
int main()
{
char str[]=“第一| |第二| | |第三”;
字符str1[]=“第一| |第二| | |第三”;
char*argv[8];
int-argc;
拆分(argv,&argc,str,“|”,0);
对于(int i=0;i
您是否已安装和/或回答了您的问题?
String
类是否有任何方法来查找字符串中的字符并返回位置?
String
类是否有子字符串方法?您可以使用方法
toCharArray()
将if转换为字符数组,然后使用
strok
这个问题与Lua有什么关系?Arduino字符串对象从来都不是必需的,这里它们是问题的一部分。是的,我同意,但OP是这样要求的。
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]);
}