|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
[C] Altro semplice programmino C
Ciao a tutti
![]() Ho due dubbi su questo programma C. Vi posto il codice: /* Stampa una riga al contrario */ #include <stdio.h> void wrt_it(void); int main(void){ printf("Input a line: "); wrt_it(); printf("\n\n"); return 0; } void wrt_it(void){ int c; if ((c=getchar())!='\n') wrt_it(); putchar(c); } 1) Se la funzione ricorsiva wrt_it non riceve alcun parametro, come fa a leggere quello che scrivo su printf se neanche lo memorizzo in un'array ad esempio? 2) Non capisco bene quello che fa la funziona wrt_it. Cioè legge i caratteri fino a che non incontra newline (proprio perché viene chiamata ricorsivamente wrt_it), però una volta che incontra '\n', la chiamata putchar(c) come fa a stampare tutto al contrario. Cioè secondo me stamperebbe solo il newline (che è il valore attuale di c); come fa ad andare al contrario? Grazie a chi mi risponderà ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 414
|
Si Funziona..
Semplice a primo inpatto non la riuscivo a capire neanche io...
ma leggendo meglio ho capito... prendiamo una stringa del tipo "ciao\n" cosa succede: si chiama la funzione wrt_it() che legge il carattere 'c' e lo salva nella variabile int c, poi essendo il carattere letto diverso da '\n' richiama un'altra volta se stessa che esguira le stesse operazioni fino a quando un'istanza della funzione non trova il carattere '\n' ed in questo caso la funzione ritorna senza richiamare un'altra volta se stessa ed a questo punto iniziano a finire tutte le funzioni al contrario di come sono state richiamando stampando a loro volta il carattere che anno letto.. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Questo dovrebbe anche risponderti alla domanda seguente.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Città: Villanova di Guidonia (RM)
Messaggi: 1079
|
Ok grazie credo di aver capito. In sostanza putchar(c) non legge quindi un singolo carattere, o meglio legge si carattere per carattere, ma legge tutti quelli che ha letto in precedenza getchar che praticamente ha creato istanze diverse per la variabile c ognuna contenente un carattere? Spero di essermi spiegato
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2002
Città: somewhere in Europe
Messaggi: 2554
|
Si credo funzioni così, ad ogni chiamata ricorsiva viene memorizzato il valore che hai definito nella chiamata e memorizzato nello stack, quando gli dai \n sganci tutte le chiamate ricorsive partendo dall'ultima che hai chiamato per arrivare alla prima, così ad esempio con la scitta ciao\n
quando arriva lo \n le funzioni ritornano prima la o, poi la a, poi la i e infine la c partendo appunto dall'ultima chiamata per arrrivare alla prima. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:27.