[RISOLTO][C] funzione strtok

di il
21 risposte

[RISOLTO][C] funzione strtok

Allora ammettiamo io abbia un file costruito in questa maneria:

nome1 \t cognome1 \t numero1 \t categoriaA
nome2 \t cognome2 \t numero2 \t categoriaA
...
Ed abbia bisogno di fare una ricerca per cognome per poi stampare chiaramente tutta la riga corrispondente.
Ho scritto questo codice:

...
char parola[30], *p, stringa[110];
...
new=fopen("rubrica.txt","r");
fgets(stringa,110,new);
		p = strtok(stringa, "\t");

		while (p!=NULL)
		{
		printf("%s ", p);
		p = strtok(NULL, "\t");
		}
Sostanzialmente se non ho sbagliato niente fino ad ora manca solo la parte in cui mi ricerca la parola chiave precedentemente inserita dall'utente ed allocata in parola[30] o no? E se si come si fa? Ho pesato a degli if ma non so davvero come fare, probabilmente perchè non ho ben capito il funzionamento della strtok e quindi cosa mi ritorna il puntatore in quel momento. Di conseguenza non so dove piazzare l'if.

21 Risposte

  • Re: [RISOLTO][C] funzione strtok

    Ti manca solamente il confronto ...
    
    char parola[30]="cognome1";
    
    	int i=1;
    
    	p = strtok(stringa, "\t");
    	while (p!=NULL)
    	{
    		//printf("%s ", p);
    		p = strtok(NULL, "\t");
    
    		if(i==1)
    			if(strcmp(p, parola)==0)
    			{
    				printf("cognome trovato : %s", p);
    				break;
    			}
    
    		i++;
    	}
    
  • Re: [RISOLTO][C] funzione strtok

    @oregon la soluzione proposta non funziona. Comunque scritto così, sì mi fa il confronto e mi stampa il cognome, ma il mio problema è che vorrei che mi stampasse sia il cognome (che trova con la prima
    p=strtok(NULL,'\t')
    che fa nel ciclo) sia il nome che a cui puntava prima
    p
    e sia il numero e la categoria alle quali punterà p successivamente prima di assumere NULL.
    Credo mi servano delle malloc ma aimè non le ho mai usate in vita mia anche se so sostanzialmente a cosa servono. Purtroppo sono autodidatta è quello che ho fatto a scuola in 3 e 4 di C l'avevo appreso da solo già prima, ora stiamo facendo Database e chiaramente facendo uno scientifico e non un informatico non abbiamo studiato malloc ecc..
  • Re: [RISOLTO][C] funzione strtok

    La malloc non c'entra ... il codice che ti ho indicato è "parte" del codice che ti serve, il resto avresti dovuto scriverlo tu.
    sì mi fa il confronto e mi stampa il cognome
    Quindi *funziona* per quello che è stato scritto, ovvero il confronto di un cognome dato con quello della stringa. In pratica c'è l'uso della strtok come volevi tu.

    Dato che la strtok modifica la stringa su cui fa la ricerca, ti basta semplicemente copiare la stringa sorgente in una temporanea e agire sulla temporanea. In questo modo avrai sempre l'originale da visualizzare quando vuoi.

    Se non arrivi a scrivere il codice con questo suggerimento, vuol dire che te lo dovrò scrivere tutto ...
  • Re: [RISOLTO][C] funzione strtok

    No no scritto quello che "dovrebbe" fare se funzionasse..
  • Re: [RISOLTO][C] funzione strtok

    Non ho capito ... quindi non sai come sfruttare il mio suggerimento per scrivere tutto il codice?
    Non ci provi neanche?
  • Re: [RISOLTO][C] funzione strtok

              
    fgets(stringa,150,new);
    strcpy(stringa2,stringa);
     p = strtok(stringa, " ");
    
     while ( p != NULL )
     {
         p = strtok(NULL, " ");
         if(strcmp(p,parola)==0)
         printf("%s",stringa2);
         break;
    }
    Ho risolto così per quanto riguarda la ricerca per cognome. Ora se applico la stessa cosa a quella per la categoria (l'ultima stringa di ogni riga) stampa sempre vuoto..
  • Re: [RISOLTO][C] funzione strtok

    Fai confusione tra le due parti, la divisione dei vari elementi e la ricerca.

    A questo punto è meglio non usare il ciclo while e ottenere i tre puntatori ai campi con
    
    char *currnom, *currcog, *currcat;
    
    currnom = strtok(stringa, "\t");
    currcog = strtok(NULL, "\t");
    currcat = strtok(NULL, "\t");
    
    Subito dopo potrai fare tutte le if che vuoi per i confronti.

    P.S. Ma le parti non erano separate da \t ? Perché nel codice usi uno spazio ?
  • Re: [RISOLTO][C] funzione strtok

    Uso lo spazio perchè ho cambiato tutto il sorgente ed il file txt. Comunque ora provo con questo nuovo aiuto, grazie!
  • Re: [RISOLTO][C] funzione strtok

    
    fgets(stringa,150,new);
    strcpy(stringa2,stringa);
    p = strtok(NULL, " ");
    p = strtok(NULL, " ");
    p = strtok(NULL, " ");
    printf("%s\n",p);
    if(strcmp(p,parola)==0)
    {
        system("PAUSE");
        printf("%s",stringa2);
    }
    
    Così facendo mi controllo se 'p' effettivamente assume la stringa di cui ho bisogno, ovvero la categoria ed è così. Però poi non passa dall'if. Non vi ci entra proprio!! Come è possibile? Eppure dichiarata la condizione allo stesso modo nella ricerca per cognome FUNZIONA ALLA PERFEZIONE!!
  • Re: [RISOLTO][C] funzione strtok

    Hai cambiato il codice che ti ho suggerito ... fai attenzione.
  • Re: [RISOLTO][C] funzione strtok

    Si lo so ma se comunque p contiene ciò di cui ho bisogno il problema non risiede in quello. Il problema ste nel fatto che non fa il controllo all'if..O no?
  • Re: [RISOLTO][C] funzione strtok

    No, la prima strtok è sbagliata !
  • Re: [RISOLTO][C] funzione strtok

    Siii scusami! in realtà sul mio codice è giusta, c'è prima
    p=strtok(stringa," ");
    Comunque anche con il tuo modo di dichiararare un puntatore per ogni sottostringa non va..
  • Re: [RISOLTO][C] funzione strtok

    E di nuovo "non va" ... non significa nulla.

    Mostra - esattamente - il codice che usi e dimmi cosa non va!
Devi accedere o registrarti per scrivere nel forum
21 risposte