|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Programma elimina commenti in C
Il problema è questo:
Devo scrivere un programma in c che elimini i commenti dal codice di un programma in c per l'appunto. Inizialmente non devo fare riferimento a file, ma semplicenete al testi inserito sul momento. Quindi immessa una riga del tipo: printf("Ciao a tutti /* coomento prova */ come va"); /* commento */ deve restituire: printf("Ciao a tutti /* coomento prova */ come va"); Quindi non eliminando il commento all'interno delle " ". Ho scritto del codice, ma presente due problemi: 1: eliminando il commento lascia però (per come è strutturato il proggo) // . 2: una volta entrato che non elimina i commenti dentro le virgolette "" non elimina più nessun altro commento. Percio se scrivo: /* ciao*/ printf("Ciao a tutti /* coomento prova */ come va"); /* commento */ mi restituisce // printf("Ciao a tutti /* coomento prova */ come va"); /* commento */ Allergo quindi il codice scritto che dovrebbe essere abbastanza chiaro. INT e EXT stanno per interno ed esterno (ad una stringa o ad un commento): #include <stdio.h> #define EXT 0 #define INT 1 int main(){ char c; char last='a'; int com=EXT; int str=EXT; while ((c = getchar ())!= EOF){ if ((c=='*')&&(last=='/')) com=INT; else if((c=='/')&&(last=='*')) com=EXT; if (c=='"') str=INT; else if((c=='"')&&(str==INT)) str=EXT; if ((com==EXT)||(str==INT)) putchar(c); last=c; } } Ciao e grazie a chi mi aiuterà
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B Ultima modifica di Beppe2hd : 19-10-2003 alle 23:02. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Possibile che nessuno coglie l'errore?
Vi pregoooo
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: May 2003
Messaggi: 119
|
if (c=='"')
str=INT; else if((c=='"')&&(str==INT)) str=EXT; deve diventare if((c=='"')&&(str==INT)) str=EXT; else if (c=='"') str=INT; altrimenti str=EXT nn lo fa mai cmq sia t lascia sempre il // e x qello devi cambiare 1 po la logica del programma. Ad esempio puoi leggere il carattere dopo qando trovi un / per vedere se è * Una cosa tipo if ((c=='/')&&((next=getchar())=='*')) com=INT; Ultima modifica di Molz : 20-10-2003 alle 13:18. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Grazie, ci provo subito.
Il problema della proposta che fai tu per eliminare il doppio / è buono, ma conta che se poi il carattere dopo non è un commento il carattere viene perso Vdrò che fare
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
Perfetto.. ho fatto enormi passi avanti grazie ai tuoi consigli molz.
Il nuovo codice è questo: #include <stdio.h> #define EXT 0 #define INT 1 int main(){ char c, next; int com=EXT; int str=EXT; while ((c = getchar ())!= EOF){ if (str==EXT){ if ((c=='/')&&((next=getchar())=='*')) com=INT; else if((c=='*')&&((next=getchar())=='/')) com=EXT; } if((c=='"')&&(str==INT)) str=EXT; else if (c=='"') str=INT; if ((com==EXT)||(str==INT)) putchar(c); } scanf("%d", &c); } Il problema resta solo quel fastidioso asterisco che vedi nell'out pout. Penso ci sia ancora un problema, ma forse complice il sonno non riesco ad individuarlo. P.S. Vedi il file allegato che mostra l'out pout
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: May 2003
Messaggi: 119
|
L'asterisco è dato dalla kiusura del commento.
qesto dovrebbe mettere a posto if ((com==EXT)||(str==INT)) if ((c!='*')||(next!='/')) putchar(c); come dicevi se invece di /* hai /asdas perdi il carattere / ma basta aggiungere qalke controllo (e lo stesso vale nel caso di */) una cosa tipo if(str==EXT) if (c=='/') if(next=getchar())=='*') com=INT; else if (com==EXT) {putchar(c); putchar(next); continue; } Inoltre forse devi controllare d nn essere arrivato alla fine del file con next Devi togliere anke i commenti scritti con // ? Ultima modifica di Molz : 21-10-2003 alle 09:17. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
No i commenti con // non sono da cancellare e comunque i serata faccio le modifiche che mi hai consigliato.
Sei mitico
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Lecce
Messaggi: 889
|
CIao
allora per il primo punto ok anche se ho dovuto fare una piccola modifica ovvero: if ((com==EXT)||(str==INT)) if (((c!='*')||(next!='/'))||(str==INT)) putchar(c); perchè se no mi toglieva gli asterischi all'interno di una stringa Per il secondo punto non ho capito un gran chè...saranno le otto ore di lezione che ho avuto oggi? Me lo commenteresti un'attimo?
__________________
I bambini e i saggi sono coloro che hanno il coraggio di dire le stupidaggini che gli adulti pensano solamente - Il nuovo forum di Anime e Manga Athlon XP 2500+ @ 2142 Mhz (209*10,5) , Abit Nf7-s rev 2.0, 512 Mb Corsair Xms PC 3200 Cas2, Ati Radeon 9500pro, HD Western Digital Caviar 80 Gb Buffer 8Mb, Lg L1710B |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: May 2003
Messaggi: 119
|
ok qella ke t ho messo nn è la soluzione ideale (e nn la ho neanke provata e qindi nn so se funziona) cmq al posto di
if (str==EXT){ if ((c=='/')&&((next=getchar())=='*')) com=INT; else if((c=='*')&&((next=getchar())=='/')) com=EXT; } io metterei una cosa tipo if(str==EXT){ //se nn sono in una stringa if (c=='/') //se il primo carattere è una barra if(next=getchar())=='*') //leggo qello dopo com=INT; //e se è un * com=INT else //altrimenti se next nn è * if (com==EXT) //se sono fuori da un commento (xké i caratteri dentro ai commenti nn li devi scrivere) {putchar(c); //scrivo la / putchar(next); //scrivo il arattere successivo continue; //ritorno al ciclo iniziale while(c=getchar()!=EOF) } if (c=='*')... }//kiusura if(str==EXT) ovviamente devi fare la stessa cosa anke per */ cmq il codice presenta ancora degli errori in situazioni limite ad esempio se 1 commento finisce così **/ devi metterlo 1 po a posto ad esempio in qesto modo int j,i; i=0; if (c=='*') //se il primo carattere è una barra while (next=getchar())=='*') i++; //conto qanti altri * c sono if(next=='*') //leggo qello dopo com=INT; //e se è un * com=INT else //altrimenti se next nn è * if (com==EXT) //se sono fuori da un commento (xké i caratteri dentro ai commenti nn li devi scrivere) {putchar(c); //scrivo la / for(j=0;j<i-1;j++) putchar('/'); putchar(next); //scrivo il arattere successivo continue; //ritorno al ciclo iniziale while(c=getchar()!=EOF) } Forse ho fatto 1 po' d casino e qalke errore cmq spero d averti dati 1 dea |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:26.



















