PDA

Visualizza la versione completa : [C++] Esercizio con array di puntatori char e crash del programma


mistergks
04-03-2012, 13:19
Ho svolto questo esercizio...mi compila ma mi da un errore "il programma ha smesso di funzionare ecc..." in fase di esecuzione! Cosa non va??

La tua amica Renata Limbranata è nei guai. Si è sposata solo pochi giorni fa eppure il suo matrimonio sembra già andare a rotoli. Suo marito passa la maggior parte del giorno al computer a scrivere mail di lavoro (dice lui!), ma lei è molto sospettosa, non riesce a credere che si sia portato il lavoro anche in viaggio di nozze… E così ha deciso! Approfittando delle assenze del marito ti ha inoltrato tutte le sue mail (circa un centinaio), pregandoti di leggerle e farle sapere se, come sospetta lei, il marito ha un’amante. Tu però, che conosci Renata e che sai quanto possa essere paranoica a volte, decidi di non sprecare belle giornate a leggere mail con molta probabilità noiose e di affidarti alle tue abilità informatiche per risparmiare tempo. A tale scopo, si scriva in C++ un programma completo opportunamente modularizzato in funzioni che, dato in input l’elenco delle mail di Renata (che per semplicità si può implementare come array di stringhe) conti quante sono le mail in cui è contenuta almeno una tra le seguenti parole: amore, tesoro, cucciolotto, trottolino.

MIA SOLUZIONE:



#include <iostream>
using namespace std;

int confronta(char *email[], char *parole[]);

int main(){
int numero_email=0;
char *email[10]={"Ciao amore come va","senti tesoro", "sei un cretino" };
char *parole[10]={"amore","tesoro","cucciolotto", "trottolino"};
numero_email=confronta(email,parole);
cout<<"Il numero delle email sospette è:"<<numero_email<<endl;


system("pause");
return 0;
}

int confronta(char *email[], char *parole[]){
int conta=0;
for(int i=0; email[i]; i++){
for(int j=0; parole[i]; j++){
if(email[i] == parole[j])
conta++;
}
}
return conta;
}

ardito86
04-03-2012, 13:58
Mah....da quello che ho studiato l'istruzione:

char *email[10]={"Ciao amore come va","senti tesoro", "sei un cretino" };

dovrebbe inizializzare i restanti termini dell'array a zero. Ma a quanto pare non lo fa e credo che questo:


for(int i=0; email[i]; i++){
for(int j=0; parole[i]; j++){
if(email[i] == parole[j])
conta++;
}
}



sia un ciclo infinito.
Forse dipende dal compilatore...prova a inizializzare tu i rimanenti termini a zero... (o meglio, NULL)

ramy89
04-03-2012, 14:16
int confronta(char *email[], char *parole[]){
int conta=0;
for(int i=0; email[i]; i++){
for(int j=0; parole[j]; j++){ // parole[j], non parole[i]
if(email[i] == parole[j])
conta++;
}
}
return conta;
}


Se c'era parole[i] il ciclo andava avanti all' infinito perchè inizialmente i è uguale a zero, ma nel for interno i non viene incrementato, per cui controlla sempre che parole[0] non sia NULL,e non si usciva mai dal ciclo.
E' indentato malissimo comunque.

mistergks
05-03-2012, 11:08
Ops!!! E' vero! Errore di distrazione! Corretto questo errore...adesso non mi funziona correttamente! Ho provato in vari modi ma niente...mi restituisce 0 invece dovrebbe restituire 2! Mi sorge un dubbio: Quegli array di puntatori a char sono corretti?!
Ora la versione corretta è questa:


#include <iostream>
using namespace std;

int confronta(char *email[], char *parole[]);

int main(){
int numero_email=0;
char *email[4]={"Ciao amore come va","senti tesoro", "sei un cretino" };
char *parole[5]={"amore","tesoro","cucciolotto", "trottolino"};
numero_email=confronta(email,parole);
cout<<"Il numero delle email sospette e':"<<numero_email<<endl;


system("pause");
return 0;
}

int confronta(char *email[], char *parole[]){
int conta=0;
for(int i=0; email[i]; i++){
for(int j=0; parole[j]; j++){
if(email[i] == parole[j])
conta++;
}
}
return conta;
}

oregon
05-03-2012, 11:39
Primo ... non si confrontano così

if(email[i] == parole[j])

le stringhe del C

(fra l'altro, perché non hai usato le stringhe del C++?)


Secondo ... in ogni caso, confronti delle frasi con delle parole ... devi controllare se le parole sono "contenute" nelle frasi ed è tutta un'altra storia.

mistergks
05-03-2012, 12:08
In grassetto le mie risposte:


Originariamente inviato da oregon
Primo ... non si confrontano così

if(email[i] == parole[j])

Ops... ho rimesso questo al posto della strcmp()

le stringhe del C

(fra l'altro, perché non hai usato le stringhe del C++?)

il motivo è che sto preparando un esame di fondamenti di informatica e quindi non posso usare le "string" ma solo array di char

Secondo ... in ogni caso, confronti delle frasi con delle parole ... devi controllare se le parole sono "contenute" nelle frasi ed è tutta un'altra storia.

Quindi dovrei separare le parole della frase con strtok() e metterle in array separati confrontando ogni volta se contengono una di quelle parole?

oregon
05-03-2012, 12:17
Sì ... puoi usare la strtok ...

Loading