Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182

    [C++] Contare parole e separazione con strtok()

    Date 2 frasi.. vorrei contare quante parole della frase 1 siano presenti all'interno della frase 2..(attenzione...parole e non lettere). Le parole all'interno della frase possono essere separate da spazio, trattino o virgola.

    Ho pensato di usare la funzione string strtok() che separa ogni parola dalla frase e le memorizza in un array.. Questo per ognuna delle due frasi
    Il problema è che ad esempio la frase: "ciao come stai"...dovrebbe memorizzarla all'interno dell'array cosi: ciao alla posizione 0, come alla posizione 1, stai alla posizione 2.. e non lettera per lettera..altrimenti non va a vedere le parole uguali..ma mi conta ogni singola lettera.

    Il mio codice non funzionante... ma che compila:
    codice:
    #include <iostream>
    using namespace std;
    
    void separaparole(char frase [], char array[]){
         char *s=strtok(frase, " ");
         int i=0;
         while(s!=NULL){
                        array[i]=*s;
                        i++;
                        s=strtok(NULL, " ");
                        }
    }
    
    int controlla(char parole1[], char parole2[]){
        int conta=0;
        for(int i=0; i<strlen(parole1); i++){
                for(int k=0; k<strlen(parole2); k++){
                        if(parole1[i] == parole2[k])
                        conta++;
                        }
                 }
        }              
    int main(){
     char fraseA[]={"ciao come stai"};
     char fraseB[]={"ciao io bene"};
     char arrayA[50], arrayB[50];
     
     separaparole(fraseA, arrayA);
     separaparole(fraseB, arrayB);
     
     cout<<controlla(arrayA, arrayB);
    
    system("pause");
    return 0;
    }

  2. #2
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Questa procedura:
    codice:
    void separaparole(char frase [], char array[]){
         char *s=strtok(frase, " ");
         int i=0;
         while(s!=NULL){
                        array[i]=*s;
                        i++;
                        s=strtok(NULL, " ");
                        }
    }
    Non è corretta, tu stai copiando solo la prima lettera di ogni parola.
    Invece ti serve un array di stringhe.
    Se vuoi mettere le varie parole in un array di stringhe innanzitutto cambia il parametro di ingresso con un puntatore a puntatore di char.
    Poi scandisci i token, per ogni token trovato allochi memoria per la copiare il token nell' array di stringhe (ti regoli sulla lunghezza usando strlen).
    E non copi solo il primo carattere, ma fai una strcpy:
    [code]
    // array è un array di stringhe, cioè un array di array di char
    strcpy(array[i],s);
    [code]
    Se invece array era un array di char, siccome s è l' indirizzo del primo elemento dell' array (è come se fosse &s[0]), quando dichiari:
    codice:
    array[i]=*s;
    Stai copiando solo la prima lettera, cioè *(&s[0]), che è uguale a *s.

    Comunque se a te bastava contare le parole, in separaparole ti bastava ritornare i,senza fare alcuna copia.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da ramy89
    Questa procedura:
    codice:
    void separaparole(char frase [], char array[]){
         char *s=strtok(frase, " ");
         int i=0;
         while(s!=NULL){
                        array[i]=*s;
                        i++;
                        s=strtok(NULL, " ");
                        }
    }
    Non è corretta, tu stai copiando solo la prima lettera di ogni parola.
    Invece ti serve un array di stringhe.
    Se vuoi mettere le varie parole in un array di stringhe innanzitutto cambia il parametro di ingresso con un puntatore a puntatore di char.
    Poi scandisci i token, per ogni token trovato allochi memoria per la copiare il token nell' array di stringhe (ti regoli sulla lunghezza usando strlen).
    E non copi solo il primo carattere, ma fai una strcpy:
    [code]
    // array è un array di stringhe, cioè un array di array di char
    strcpy(array[i],s);
    [code]
    Se invece array era un array di char, siccome s è l' indirizzo del primo elemento dell' array (è come se fosse &s[0]), quando dichiari:
    codice:
    array[i]=*s;
    Stai copiando solo la prima lettera, cioè *(&s[0]), che è uguale a *s.

    Comunque se a te bastava contare le parole, in separaparole ti bastava ritornare i,senza fare alcuna copia.
    no io voglio contare le parole in comune alla frase 1 e alla frase 2..
    se per esempio la frase 1 è "ciao come stai" e la frase 2 è "ciao stai bene" dovrebbe restituirmi 2 perchè ci sono due parole in comune! (ciao e stai)

    quindi dovrei mettere ogni parola che separo in un array di array cosi?
    codice:
    void separaparole(char frase [], char *array[]){
         char *s=strtok(frase, " ");
         int i=0;
         while(s!=NULL){
                        array[i]=s;
                        i++;
                        s=strtok(NULL, " ");
                        }
    }

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Si, ora che hai l' array di stringhe, per ogni stringa del primo array controlli che non ce ne sia una uguale nel secondo array, se ce ne è una uguale aumenti il conteggio di uno.
    Però devi tenere traccia delle dimensioni dei due array.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    182
    Originariamente inviato da ramy89
    Si, ora che hai l' array di stringhe, per ogni stringa del primo array controlli che non ce ne sia una uguale nel secondo array, se ce ne è una uguale aumenti il conteggio di uno.
    Però devi tenere traccia delle dimensioni dei due array.
    ho provato a correggere il codice ma non riesco a farlo compilare:
    codice:
    #include <iostream>
    using namespace std;
    
    void separaparole(char *frase, char *array[]){
         int i=0;
         char *s=strtok(frase, " ");
         while(s!=NULL){
                        array[i]=s;
                        i++;
                        s=strtok(NULL, " ");
                        }
    }
    
    int controlla(char *parole1[], char *parole2[]){
        int conta=0;
        for(int i=0; i<strlen(*parole1); i++){
                for(int k=0; k<strlen(*parole2); k++){
                        if(parole1[i] == parole2[k])
                        conta++;
                        }
                 }
        }
        
    int main(){
     char *fraseA={"ciao come stai"};
     char *fraseB={"ciao io bene"};
     char *arrayA[100], arrayB[100];
     
     separaparole(*fraseA, *arrayA[]);
     separaparole(*fraseB, *arrayB[]);
     
    cout<<controlla(arrayA, arrayB);
    
    system("pause");
    return 0;
    }
    cosa c'è che non va?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da mistergks
    cosa c'è che non va?
    Ci sono troppe cose che non vanno ... ti mostro il codice con tutte le correzioni ... dacci un'occhiata ...

    codice:
    #include <iostream>
    
    using namespace std;
    
    void separaparole(char *frase, char *arr[])
    {
    	int i=0;
    
    	arr[i] = strtok(frase, " ");
         
    	while(arr[i]!=NULL)
    		arr[++i]=strtok(NULL, " ");
    }
    
    int controlla(char *parole1[], char *parole2[])
    {
    	int conta=0;
    
    	for(int i=0; parole1[i]; i++)
    		for(int j=0; parole2[j]; j++)
    			if(strcmp(parole1[i], parole2[j])==0)
    				conta++;
    
    	return conta;
    }
        
    int main()
    {
    	char fraseA[20], fraseB[20];
    	char *arrayA[100], *arrayB[100];
    
    	strcpy(fraseA, "ciao come stai");
    	strcpy(fraseB, "ciao io bene");
    
    	separaparole(fraseA, arrayA);
    	separaparole(fraseB, arrayB);
     
    	cout << controlla(arrayA, arrayB) << endl;
    
    	system("pause");
    	return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.