Allora, il mio C è molto vecchiotto per cui il codice non sarà ottimizzato al massimo, ma ho trovato gli errori!
Questo intanto è il codice con le correzioni che compila e funziona:
Codice:
/*programma che elimina le vocali da una parola inserita dall'utente*/
#include <stdio.h>
#include <string.h>
#define size 30
void cancella(char v[size]);
int main(){
char input[size]; //stringa dove memorizzo la parola dell'utente
printf("inserire una parola a cui bisogna togliere le vocali\n");
scanf("%s",input); //leggo la parola dell'utente
cancella(input); //funzione che cancella le vocali
getch("pause");
return 0;
}
void cancella(char input[size]){
int lunghezzaEffettiva = strlen(input);
int x, j=0;
char stringa[lunghezzaEffettiva];
/*controllo che la lettera posizionata all'indice v[j] sia una vocale,
se è una vocale passo alla lettera successiva,
se non è una vocale memorizzo la consonante nella stringa nella posizione stringa[k]*/
for(x=0;x<=lunghezzaEffettiva;x++)
if((input[x]=='a') || (input[x]=='e') || (input[x]=='i') || (input[x]=='o') || (input[x]=='u'))
;
else {
stringa[j] = input[x];
j++;
}
printf("%s", stringa);
}
Veniamo agli errori:
1) Quando hai chiamato la funzione cancella, hai scritto cancella(v[size]), mentre dovevi inserire cancella(v). Come avevi scritto tu è come se tu stessi passando a cancella una nuova definizione della variabile v...sintatticamente corretto (credo...dovrei andare a rispolverare il Deitel&Deitel ), ma facevi impazzire tutto.
2)Il printf("%s\n",stringa); le cose sono due: o fai in modo che la funzione cancella restituisca una stringa e la salvi dentro la variabile stringa che hai creato nel main, oppure fai quello che ho fatto io, ovvero inizializzi, modifichi e stampi la variabile stringa dentro il metodo cancella. Ricorda: una variabile nasce, si modifica e muore all'interno del metodo in cui viene chiamata. Se vuoi permettere a quella variabile di vivere in tutto il tuo programma, allora devi inizializzarla come globale...ma è una pratica assolutamente sconsigliata.
3) if((v[j]=="a") || (v[j]=="e") || (v[j]=="i") || (v[j]=="o") || (v[j]=="u")) stai confrontando caratteri di stringa (quindi char), per cui invece di " devi usare ', ovvero
if((input[x]=='a') || (input[x]=='e') || (input[x]=='i') || (input[x]=='o') || (input[x]=='u'))
Appunti personali:
Come hai notato mi sono permesso di modificare la variabile v in input e di semplificare un po' il procedimento di ricerca. Quando crei un codice cerca di usare nomi di variabili più esplicativi possibile, anche se stai facendo un codice piccolo come questo, aiuta nella comprensione futura e, se lavori in team, permette anche a chi lavora con te di comprendere il tuo codice.
Inoltre quando crei un algoritmo cerca di pensare alla strada più semplice e di realizzarlo nella maniera più semplice, ad esempio io ho preso la tua idea, ma ho tolto un po' di roba che facevi in più:
* controllo che il carattere sia una vocale
* se lo è non faccio niente, per cui il for va avanti con il prossimo carattere
* se non lo è allora copio quel carattere nella stringa di appoggio e incremento il contatore della stringa di appoggio.
Non so se hai studiato le librerie che manipolano stringhe, ma invece di scorrere il contenitore input fino a 30, conviene scorrerlo sono fino a dove è "pieno". Per fare ciò ti basta semplicemente utilizzare la funzione strleng(v) che ti restituisce un intero con la lunghezza della stringa v, risparmiandoti un sacco di cicli nel for. Inoltre ti permette di risparmiare buffer di memoria creando una stringa di appoggio che sia lunga almeno come quella di input.
getch("pause") serve a bloccare il terminale, in modo che non si chiuda appena il programma ha terminato l'esecuzione dell'algoritmo.
se hai domande chiedi pure!