Newsgroup: it.comp.lang.c++
Titolo: tokenizing

Non ci arrivo.. ho trovato questo programma che legge una frase e ne estrae
i token l'ho provato e funziona.. ma nn lo capisco proprio..
Qualcuno me lo spiega come se avessi 5 anni? anzi come se ne avessi 95 in
quanto sono talmente rincoglionito che se ne avessi 5 probabilmente lo
capirei
grazie Alex
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
        char str[80];
        char token[80];
        int i,j;
        cout << "scrivere una frase:";
        gets(str);
        for(i=0;;i++){
                     for(j=0;str[i]!=' ' && str[i];j++,i++)
                     token[j]=str[i];
                     token[j]='\0';
                     cout << token << '\n';
                     if(!str[i])break;
                     }
      system("PAUSE");
      return 0;
}

 capirei
A parte il fatto che il programmino e' un pessimo esempio di C++, se non altro
perche' e' praticamente un programma scritto in C tranne per il fatto che usa
cout e il relativo operator<< per l'output, e anche in questo sbaglia perche' si
basa su una implementazione degli stream che e' vecchia di anni e non e'
standard.
Comunque prova a vedere se riesci a capirlo quando te lo riscrivo indentato
correttamente, con pochi commenti e alcune minimali modifiche (e se riesci a
capire come le modifiche siano solo di forma e non di sostanza):
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char str[80];
    char token[80];
    int i,j;
    cout << "scrivere una frase:";
    gets(str);
    for( i=0; ; i++ ) {
        // copia un token
        for( j=0;  str[i] != ' '  &&  str[i] != 0;   j++,i++ )
            token[j] = str[i];
        // termina la sringa token e stampala
        token[j] = '\0';
        cout << token << '\n';
        // se siamo alla fine della stringa in
        // ingresso esci dal ciclo
        if( str[i] == 0 )
            break;
    }
    system("PAUSE");
    return 0;
}
E se non lo capisci, prova a vedere se non ci capisci nulla o se c'e' qualche
cosa in particolare che non ti e' chiara.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

Grazie mille per la risposta mi è stata d'aiuto le cose che nn capisco lo
stesso cmq sono:
Nel primo ciclo for gli dico:
for(i=0;;i++) e mi sta bene è come se gli dicessi comincia a fare quello che
ti dico..
poi metto un secondo ciclo e gli dico
for( j=0;  str[i] != ' '  &&  str[i] != 0;   j++,i++ )
            token[j] = str[i];
             token[j] = '\0';
Questa parte mi riesce un po' difficile perchè:
Gli dico per j=0 controlla che nell'iesima "casella " dell'array str il
carattere nn sia uno spazio o un terminatore null..
dopo il controllo la funzione for mi sembra di avere capito che esegue le
istruzioni e a me verrebbe da pensare in questo modo:
j=0 i=0 supponiamo che io scriva "ciao mondo" nell'array str[0] c'è una c
quindi la condizione è vera quindi pongo nel token[0] la lettera c ora il
mio ciclo cosa fa? a me verrebbe da pensare che segua anche l'istruzione
precedente cioè esegua token[j]='\0' e allora dico ci mette una c o un
terminatore null in sto benedetto token[j] e poi nn capisco perchè i++
compare sia nel primo cislo di for sia nel secondo...
Ho provato a togliere prima uno e poi l'altro per vedere gli effetti ed in
effetti (scusa il gioco di parole) fa dei casini...
Ti chiedo pazienza sono un po' bacato ma poi se capisco il concetto sono a
posto
Grazie mille..
Alex

 compare sia nel primo cislo di for sia nel secondo...
Innanzi tutto, quando c'è un ciclo for senza le parentesi, il ciclo
verifica solo il primo statement subito dopo il for:
for( j=0;  str[i] != ' '  &&  str[i] != 0;   j++,i++ )
	token[j] = str[i];
equivale a;
for( j=0;  str[i] != ' '  &&  str[i] != 0;   j++,i++ )
{
	token[j] = str[i];
}
Questo ciclo legge da str i caratteri e li mette in token, fino a che
non viene incontrato uno spazio, che indica la fine del token corrente,
oppure un carattere nullo, che indica la fine della stringa str.
Ovviamente l'incremento viene fatto sia su i, per poter leggere tutti i
caratteri di str, che su j, per copiare via via i caratteri letti su
token; quando si rientra nel ciclo, alla prossima iterazione del ciclo
for esterno, j verrà reinizializzato a zero. 
Quando si esce dal ciclo (il secondo), la prima cosa da fare è
aggiungere all'array token un carattere nullo, per poterlo trattare come
una stringa, e poter essere passato al successivo cout.
Spero di averti chiarito le idee. Ciao, 
Cecco

Perfetto grazie ad entrambi..!!!

             token[j] = '\0';
Nope. Guarda con le parentesi:
for( j=0;  str[i] != ' '  &&  str[i] != 0;   j++,i++ ) {
	token[j] = str[i];
}
token[j] = '\0';
In pratica se il carattere i-esimo di str e` diverso da 0 e dallo spazio
allora viene copiato nel token. Se e` uguale a 0 o allo spazio allora il
ciclo finisce ed il token viene terminato con 0.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Il coraggio non mi manca.
E` la paura che mi frega...

 Questa parte mi riesce un po' difficile perchč:
...
A parte le risposte che ti hanno dato Francesco e Kronos, se guardi meglio il
codice che ti ho postato lo capisci!


Ho capito tutto grazie sono un cazzo nn mi ero accorto da bravo
programmatore quale sono che alla fine dell'istruzione for c'era un punto e
virgola!
Grazie  ancora
Alex