通过delemiter(Arduino)将字符串拆分为数组

时间:2016-05-08 15:47:06

标签: split arduino

我试图通过&#34 ;;"将字符串拆分为字符数组。

这样的事情:

String a = "banana;apple;orange";
char *fruits = a.split(";");

我需要做些什么才能实现这一目标?

1 个答案:

答案 0 :(得分:0)

我们可以在C中用strtok()分割一个带有特定分隔符的字符串(" ;")。 strtok()使用字符串,因此我们必须复制。如果在其他地方需要原始字符串,并使用字符串的副本而不是原始字符串。

#include <assert.h>
#include <stddef.h>
#include <memory.h>
#include <stdlib.h>
#include <stdio.h>

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

char** str_split(char* a_str, const char a_delim)
{
    char** result    = 0;
    size_t count     = 0;
    char* tmp        = a_str;
    char* last_comma = 0;
    char delim[2];
    delim[0] = a_delim;
    delim[1] = 0;

    /* Count how many elements will be extracted. */
    while (*tmp)
    {
        if (a_delim == *tmp)
        {
            count++;
            last_comma = tmp;
        }
        tmp++;
    }

    /* Add space for trailing token. */
    count += last_comma < (a_str + strlen(a_str) - 1);

    /* Add space for terminating null string so caller
       knows where the list of returned strings ends. */
    count++;

    result = malloc(sizeof(char*) * count);

    if (result)
    {
        size_t idx  = 0;
        char* token = strtok(a_str, delim);

        while (token)
        {
            assert(idx < count);
            *(result + idx++) = strdup(token);
            token = strtok(0, delim);
        }
        assert(idx == count - 1);
        *(result + idx) = 0;
    }

    return result;
}

int main()
{

    char** tokens;
    char months[] = "banana;apple;orange";

    printf("fruits=[%s]\n\n", months);

    tokens = str_split(months, ';');

    if (tokens)
    {
        int i;
        for (i = 0; *(tokens + i); i++)
        {
            printf("fruits=[%s]\n", *(tokens + i));
            free(*(tokens + i));
        }
        printf("\n");
        free(tokens);
    }

    return 0;
}

测试

splitstr
fruits=[banana;apple;orange]

fruits=[banana]
fruits=[apple]
fruits=[orange]

Process finished with exit code 0