Allora ci sono diversi errori.
il primo piu grosso è che nell' if dopo ogni or devi tornare a confrontare la variabile:
//ERRATO
if (a = 1 || 2 || 3)
//GIUSTO
if (a=1 || a=2 || a=3)
il secondo è l'errato uso degli operatori booleani.
sempre nell'if entri sempre perchè per forza un carattere è diverso da tutti quelli elencati:
se il carattere ad esempio è a:
carattere !=a (false) || carattere !=b (true) allora entro nell'if.....
devi quindi usare l'and perchè deve sessere diverso da tutte le vocali.
Stesso errore per il ciclo for,il ciclo continua fintanto che il confronto è vero e quindi
supponiamo che le variabili siano:
chiudi=5
strlen=10
i=3
avremo:
chiudi < 3 (false) || i < strlen (true) continuo perchè false || true = true
anche qui allora si usa l'and
chiudi < 3 (false) || i < strlen (true) mi fermo perchè false && true = false
for (unsigned int i=0; chiudi < 3 && i < cognome.length(); i++)
{
if (cognome.substr(i,1) != "a" && cognome.substr(i,1) != "e" &&
cognome.substr(i,1) != "i" && cognome.substr(i,1) != "o" &&
cognome.substr(i,1) != "u")
{
cgn += cognome.substr(i,1);
chiudi++;
}
}
cout << endl << cgn;
[dimenticavo]
il ciclo inizia da zero quindi per tre consonanti chiudi dovrà essere minore di 3 e non di 4!
[/dimenticavo]