Risolto Dividere una stringa in parole usando c (da char* a char**)

zouth

Utente Silver
16 Dicembre 2020
82
36
4
61
Ciao a tutti,
Devo creare una funzione
C:
char** get_tokens(char* line)
la quale ritorna un array con tutte le parole presenti in una stringa.

Ho provato usando
C:
strtok
e
C:
strtok_r
ma non sono pratico nel mettere la stringa ottenuta nell array.

Grazie.
 
Ultima modifica:
strtok_r potrebbe essere un modo. Io ho implementato una piccola alternativa perché non mi piace l'idea di alterare anche la stringa originale (così funziona anche se su memoria readonly), probabilmente ci sono modi migliori a partire dal fatto che la signature della funzione non mi convince molto, tende a memory leak, non dà la dimensione, non accetta altri delimiter da parametro...

C:
char** get_tokens(const char* line)
{
    int i, j, k, len, nTokens = 0;
    len = strlen(line);
    i = len;
    while (i--)
        if (line[i] == ' ')
            nTokens++;

  
    char* buffer = (char*)malloc(len + 1);
    char** ret = (char**)malloc((nTokens + 2) * sizeof(char*));

    if (buffer == 0 || ret == 0)
        return 0;

    for (i = 0, j = 0, k = 0; i <= len; i++)
    {
        if (line[i] == ' ')
        {
            buffer[i] = 0;
            ret[j++] = &buffer[k];
            k = i + 1;
        }
        else
            buffer[i] = line[i];
    }
    ret[j++] = &buffer[k];
    ret[j] = 0;
    return ret;
}

int main()
{
    char **tmp, **arr = get_tokens("Lorem ipsum dolor sit amet.");
    tmp = arr;
    while (*tmp)
    {
        printf("%s ", *tmp);
        tmp++;
    }
    free(*arr);
    free(arr);
}
 
  • Mi piace
Reazioni: zouth
Intanto grazie.
Posso chiedre perche
C:
char** ret = (char**)malloc((nTokens + 2) * sizeof(char*));
e non
C:
char** ret = (char**)malloc((nTokens + 1) * sizeof(char*));
?
 
Perché nTokens è il numero di spazi trovati nella stringa, "ciao amico" ha uno spazio solo ma le parti saranno due, il terzo serve a capire che finisce lì l'array (ret[2] == 0) nel codice della main il check lo vedi in while (*tmp).
 
  • Mi piace
Reazioni: zouth
Perché nTokens è il numero di spazi trovati nella stringa, "ciao amico" ha uno spazio solo ma le parti saranno due, il terzo serve a capire che finisce lì l'array (ret[2] == 0) nel codice della main il check lo vedi in while (*tmp).
Ah grazie mille, ho dato per scontato che nTokens fosse il numero dei tokens e non degli spazi.