PDA

View Full Version : [C++] Contare parole e separazione con strtok()


mistergks
16-01-2012, 23:53
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:


#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;
}


N.B.: dato che mi sto preparando per un esame di fondamenti di c++ non posso usare strutture dati avanzate e quant'altro...posso arrivare fino ai puntatori..e la struttura dati da utilizzare è l'array.

GByTe87
17-01-2012, 00:07
Ho dato un'occhiata rapida, e il problema mi pare essenzialmente questo:

void separaparole(char frase [], char array[]){
char *s=strtok(frase, " ");
int i=0;
while(s!=NULL){
array[i]=*s;
i++;
s=strtok(NULL, " ");
}
}

Non puoi usare un'array di char per memorizzare delle parole intere; dovrai usare un'array di array di char, o qualcosa di equivalente.

mistergks
17-01-2012, 00:11
Ho dato un'occhiata rapida, e il problema mi pare essenzialmente questo:

void separaparole(char frase [], char array[]){
char *s=strtok(frase, " ");
int i=0;
while(s!=NULL){
array[i]=*s;
i++;
s=strtok(NULL, " ");
}
}

Non puoi usare un'array di char per memorizzare delle parole intere; dovrai usare un'array di array di char, o qualcosa di equivalente.

cosa intendi per array di array? questo ad esempio?
Esiste un metodo piu facile di risolvere il problema?
char *array[]={"ciao come stai"};

GByTe87
17-01-2012, 10:18
Ti posto un esempio scritto al volo. :)

È in C e non in C++, ma la sostanza non cambia. :p

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int separaParole(char * frase, char * parole[10]);

int main (int argc, char **argv)
{
char frase[100];
memset(frase, 0x00, sizeof(frase));
strcpy(frase, "Contare parole e separazione con strtok");

char * parole[10];

int i, nParole = separaParole(frase, parole);

for (i = 0; i < nParole; ++i){
fprintf(stderr, "%s\n", parole[i]);
}

exit(EXIT_SUCCESS);
}

int separaParole(char * frase, char * parole[10])
{
fprintf(stderr, "[Frase] %s\n\n", frase);
int nParole = 0;
char * ptr = strtok(frase, " ");

while (ptr != NULL)
{
parole[nParole++] = ptr;
ptr = strtok(NULL, " ");
}
return nParole;
}

Come vedi, uso un array di char pointer per memorizzare i riferimenti alle parole. :D

mistergks
17-01-2012, 18:38
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:


#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?