Dubbio funzione strtok

di dragon2973 il
5 risposte

Ciao a tutti, non ho capito di preciso come funziona la funzione strtok e nemmeno se nel mio caso sia utile usarla: data una stringa in input del tipo “parolarandom 2  10 11” dove 2 indica il numero di numeri che seguono, dovrei essere in grado di salvare quei due numeri come interi

ho scritto queste righe di codice, il problema e' che nel ciclo while fa meno cicli del dovuto e che per qualche ragione sembra  che strtok a volte restituisca null

char *input;
res=(fgets(buffer,1000,pfile);
input=strtok(res, " ");

        if (strncmp(input, "parolarandom", 10) == 0) {
                quantinumeridevoleggere = atoi(strtok(NULL, " "));
                while(input!=NULL) {
                    numeroletto = atoi(strtok(NULL, " "));
                    //inserisco in una lista il numero letto 
                    input= strtok(NULL, " ");
                }
        }

5 Risposte

  • Forse perché richiami due volte la funzione strtok(NULL, " ") dentro il ciclo.

    Prova in questo modo:

    input= strtok(NULL, " ");
    while(input!=NULL) {
           numeroletto = atoi(input));
           //inserisco in una lista il numero letto 
           input= strtok(NULL, " ");
           }
  • Scusa se rispondo dopo tanto: ho pensato che io so di preciso quanti numeri devo leggere quindi ho scritto una cosa di questo tipo. Non riesco a capire come mai, ma a un certo punto anche se la stringa da leggere non e' finita, strtok restituisce null. Ad esempio se deve leggere i primi dieci numeri da 1 a 10 legge i primi 7 e poi mi restituisce null null null

    input=strtok(stringa, " ");
    numletto=atoi(strtok(NULL, " ")); //perche' il numero da leggere non e' la prima 
    							//parola ma la seconda
    
    for(int i=0; i<numletto; i++){
    
    	numero=atoi(strtok(NULL, " "));
    
    }
  • Non capisco il problema. Puoi mostrare con quale stringa di input stai lavorando?

    Ovvero la variabile stringa cosa contiene esattamente e cosa vuoi ottenere?

    Nell'ipotesi che la stringa contenga quello che hai detto nel primo post, allora basta

        char stringa[] = "parolarandom 2 10 11";
       
       char *input = strtok(stringa, " ");
       int numletto = atoi(strtok(NULL, " "));
       printf("Parola iniziale %s\n", input); 
       printf("Numero di valori %d\n\n", numletto);
       for (int i = 0; i < numletto; i++) {
           int numero = atoi(strtok(NULL, " "));
           printf("Numero %d\n", numero);
       }

    Oppure col tuo codice

    
        if (strncmp(input, "parolarandom", 10) == 0) {
           int quantinumeridevoleggere = atoi(strtok(NULL, " "));
           printf("Numeri da leggere %d\n", quantinumeridevoleggere);
           while(quantinumeridevoleggere--) {
               int numeroletto = atoi(strtok(NULL, " "));
               printf("Numero letto %d\n", numeroletto);
           } 
       }
    
  • Scusami, alla fine ho risolto, facevo un errore imbarazzantemente stupido nel modo in cui prendevo da input la stringa

    Grazie mille comunque!

  • Devi sempre fare il debugging prima di scrivere nel forum

Devi accedere o registrarti per scrivere nel forum
5 risposte