Grazie skynet. Onde evitare l'apertura di un altro thread, espongo qui un altro algoritmo che non mi riesce molto bene. In pratica dato un array di stringhe, devo scrivere un programma che legga una parola chiave da cercare all'interno della matrice di stringhe, e ne determini il numero di occorrenze. L'esercizio mi dice anche di utilizzare la funzione di libreria strstr. Io ho provato ad implementare questo algoritmo ma qualcosa non va a dovere. In sostanza se nella stringa c'è una sola occorrenza l'algoritmo funzione. Ad esempio:
stringa 1: ciao come stai
stringa 2: ora vado ciao
Se io digito stringa da cercare: "ciao" mi restituisce effettivamente 2. Se invece la stessa parola da cercare è ripetuta più volte nella stessa stringa non la conta. Ad esempio
stringa 1: ciao ciao ciao
stringa 2: torno presto ciao
se cerco "ciao" mi restituisce 2 e non 4! stessa cosa se la stringa risulta non spaziata ad esempio
ciaociaociao mi restituisci 1 e non 3! Dov'è l'errore? Come al solito incollo il codice:
#include <iostream>
#include <cstring>
using namespace std;
void leggi (char [][80], int num);
void scrivi (char [][80], int num);
int main ()
{
cout << "Quante stringhe vuoi inserire? ";
int num;
cin >> num;
char stringa[num][80];
leggi(stringa,num);
cout << endl;
scrivi(stringa,num);
char *p; // puntatore che scorre lungo le varie stringhe
char cerca[80]; // stringa da cercare
cout << "Stringa da cercare: ";
cin.getline (cerca, 80);
int numero=0; // contatore per le occorrenze
for (int i=0; i<num; i++)
{
p=&stringa[i][0];
char *q=strstr(stringa[i],cerca);
if (q!=NULL)
{
numero++;
p++;
}
}
cout << "Numero di occorrenze pari a: " << numero;
cout << endl << endl;
system ("PAUSE");
return 0;
}
void leggi (char v[][80], int num) // Lettura delle num stringhe
{
for (int i=0; i<num; i++)
{
cout << "Stringa " << i+1 << ": ";
cin.sync(); // Pulisce lo stream
cin.getline(v[i],80);
}
}
void scrivi (char v[][80], int num) // Scrittura delle num stringhe
{
for (int i=0; i<num; i++)
{
cout << "Stringa " << i+1 << ": ";
cout << v[i] << endl;
}
}