用 Arduino 按分隔符分割字符串的简单方法

我有一个字符串,想按 | 进行分割,以便在需要时调用该部分,请查看以下示例

String test= "first|Second|third";

那么我应该如何使用如下代码

string1="first";

string2="second";

string3="third";

或者使用 word[0]、word[1]、word[2]

因为我是 Arduino 新手,不知道该怎么尝试

在 PHP 中,我会像这样做:explode("|", test) 因此,我希望我的问题很清楚

点赞
用户4724047
用户4724047

我在Arduino上测试了以下代码,它可以正常运行。你需要根据你的需求来修改它。

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

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() {
}
2020-03-05 22:44:35
用户6110094
用户6110094

在 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]);
}
2020-03-05 22:55:31