Split string with delimiters in C

前端 未结 20 1386
你的背包
你的背包 2020-11-21 11:56

How do I write a function to split and return an array for a string with delimiters in the C programming language?

char* str = \"JAN,FEB,MAR,APR,MAY,JUN,JUL,         


        
20条回答
  •  渐次进展
    2020-11-21 12:21

    Explode & implode - initial string remains intact, dynamic memory allocation

    #include 
    #include 
    #include 
    #include 
    
    typedef struct
    {
        uintptr_t   ptr;
        int         size;
    } token_t;
    
    int explode(char *str, int slen, const char *delimiter, token_t **tokens)
    {
        int i = 0, c1 = 0, c2 = 0;
    
        for(i = 0; i <= slen; i++)
        {
                if(str[i] == *delimiter)
                {
                    c1++;
                }
        }
    
        if(c1 == 0)
        {
                return -1;
        }
    
        *tokens = (token_t*)calloc((c1 + 1), sizeof(token_t));
        ((*tokens)[c2]).ptr = (uintptr_t)str;
    
        i = 0; 
        while(i <= slen)
        {
            if((str[i] == *delimiter) || (i == slen))
            {
                    ((*tokens)[c2]).size = (int)((uintptr_t)&(str[i]) - (uintptr_t)(((*tokens)[c2]).ptr));
                    if(i < slen)
                    {
                        c2++;
                        ((*tokens)[c2]).ptr = (uintptr_t)&(str[i + 1]);
                    }
            }
            i++;
        }
        return (c1 + 1);
    }
    
    char* implode(token_t *tokens, int size, const char *delimiter)
    {
        int     i, len = 0;
        char    *str;
    
        for(i = 0; i < len; i++)
        {
            len += tokens[i].size + 1;
        }
    
        str = (char*)calloc(len, sizeof(char));
    
        len = 0;
        for(i = 0; i < size; i++)
        {
            memcpy((void*)&str[len], (void*)tokens[i].ptr, tokens[i].size);
            len += tokens[i].size;
            str[(len++)] = *delimiter;
        }
    
        str[len - 1] = '\0';
    
        return str;
    }
    

    Usage:

    int main(int argc, char **argv)
    {
        int         i, c;
        char        *exp = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC";
        token_t     *tokens;
        char        *imp;
    
        printf("%s\n", exp);
    
        if((c = explode(exp, strlen(exp), ",", &tokens)) > 0)
        {
            imp = implode(tokens, c, ",");
            printf("%s\n", imp);
    
            for(i = 0; i < c; i++)
            {
                printf("%.*s, %d\n", tokens[i].size, (char*)tokens[i].ptr, tokens[i].size);
            }
        }
    
        free((void*)tokens);
        free((void*)imp);
        return 0;
    }
    

提交回复
热议问题