C, utilizzo funzione strtok

di il
3 risposte

C, utilizzo funzione strtok

Ho questa stringa: "ciao mondo come stai". Vorrei "spezzarla" usando come delimitatore lo spazio.

Ho letto la definizione di strtok, che è la funzione apposita e:

- La prima volta strtok va chiamata con la stringa da spezzare e la stringa dei delimitatori.
- Le volte successive con NULL come primo parametro e la stringa dei delimitatori, che puo' variare di volta in volta.
- Restituisce un puntatore al token individuato o NULL nel caso non sia
possibile individuare alcun token.

Ho preso spunto da questo codice:

#define DELIM " ,;.:\"'-?!"

int main()
{
    char line[81]; /* suppongo che le linee siano al piu' 80 caratteri */
    char *token;
    int num_parole=0;
    
    printf("Inserisci delle frasi e premi ^Z alla fine:\n");
    while(gets(line)!=NULL)
    {
        token=strtok(line, DELIM);
        while(token)
        {
            num_parole++;
            printf("Parola individuata: %s\n", token);
            token=strtok(NULL, DELIM);
        }
    }
    
    printf("Il numero di parole inserite è %d\n", num_parole);
}
Ma io vorrei applicarla su una stringa non data da input.

Quindi:
#include <string.h>
#include <stdio.h>

int main()
{
	char *str = "Ciao mondo come stai", *token;
	int i = 0;

	token = strtok(str, " ");
	while(token)
	{
		printf("token: %s\n", token);
		token = strtok(NULL, " ");
	}

}
Errore di segmentazione (core dump creato) .. credo centri col fatto che token = strtok(str, " "); venga chiamata solo una volta..?

3 Risposte

  • Re: C, utilizzo funzione strtok

    In quel modo hai un semplice puntatore ad un'area costante. Dato che la stringa deve essere modificata dalla strtok e un'area costante non può, hai quell'errore.

    Quindi devi scrivere

    char str[] = "Ciao mondo come stai";
  • Re: C, utilizzo funzione strtok

    Praticamente la strtok mette degli '\0' nella stringa passata al posto del carattere "delimiter", ma per poterlo fare deve poter aver accesso alla memoria.
    Per non sbagliare in futuro conviene dichiarare la stringa in modo corretto:
    
    const char* stringa = "Ciao mondo";
    
    In questo modo il compilatore ti avrebbe segnalato un warning e ti saresti accorto che la strtok vuole un vettore di char e quindi un'area della memoria modificabile e non una costante, come il parametro sucessivo.
  • Re: C, utilizzo funzione strtok

    Perfetto, vi ringrazio
Devi accedere o registrarti per scrivere nel forum
3 risposte