Newsgroup: it.comp.lang.c
Titolo: differenza getchar

Scusate la domanda cretina, ma ancora non ho capito la risposta:
ho 2 programmini di questo tipo:
A)
#include <stdio.h>
main(){
char c;
c=getchar();
while(c!=EOF){
        putchar(c);
        c=getchar();
        }
        }
B)
#include <stdio.h>
main(){
char c;
while((c=getchar())!=EOF){
        putchar(c);
        }
}
Ora, mi si chiede quale tra queste 3 risposte sia quella giusta per A) e per  
B):
1) l'effetto del programma č di copiare stdin su stdout fino a EOF escluso e 
poi terminare
2) l'effetto del programma č di copiare stdin su stdout fino a EOF incluso e 
poi terminare
3) l'effetto del programma č di copiare stdin su stdout fino a EOF escluso 
senza perň terminare
Secondo me la risposta per entrambi (A e B) č la 1, ma invece no č cosě.
Quale sono le risposte giuste e, soprattutto , perchč???
Grazie per l'aiuto
Andrea

 }
Il primo programma e' sbagliato, il secondo pure, ecco la risposta esatta 
(la variabile C la devi dichiarare INT, altrimenti non intercetti 
correttamente EOF, o meglio, intercetti anche quello che non devi 
intercettare).
Se poi correggi questo errore le risposte sono:
- il primo legge due carattere e stampa a video il primo
- il secondo legge carattere per carattere e stampa tutto a video
Al primo nessuna delle frasi si addice, al secondo solo la prima, ma devi 
prendere con le molle l'affermazione su EOF.
Entrambi terminano ad EOF... ricordo che EOF non e' un valore, ma un 
informazione associata al file, quindi continua a ripetertelo finche' 
cerchi di leggerci e sei arrivato alla fine.
C'e' una piccola variante se stdin punta a stty, in quel caso EOF puo' venir 
generato da una particolare combinazione di tasti e ovviamente nel secondo 
programma devi ripeterla "nella" getchar() all'interno del while se no non 
viene intercettata.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

while(c!=EOF){
EOF č rappresentato in un int
quindi c doveva essere un int.
ciao 
 sbirish

 prendere con le molle l'affermazione su EOF.
le risposte che ho , almeno 1 deve esser per forza esatta ( o meglio, devo 
per forza segnarne una tra quelle).
il programma ha char c per far accettare anhce i caratteri, quindi mi devo 
per forza basare su questo.
Se ti fosse capitata una domanda cosě, e avresti per forza dovuto rispondere 
1 di queste domande, quale avresti risposto???
Grazie, Ciao!
Andrea

 rispondere 1 di queste domande, quale avresti risposto???
Io mi sarei messo a ridere, poi il comportamento dipende dal contesto. La 
risposta che ti ho dato e' quella che avrei dato nel test.
Se il test era in un libro l'avrei usato per accendere la "stùa" :)


 possibili e ammisse)... 
Cioè? Non ho capito una mazza. :) Puoi ri-spiegarlo in un modo che più si 
addice alle mie ristrette capacità intellettive? :)

Daniele wrote:

Proviamo con i bit:
"-1" in complemento a 2 su 32 bit si scrive cosi':
    11111111 11111111 11111111 11111111
"-1" in complemento a 2 come char (assumo 8 bit) si scrive cosi':
    11111111
Ora, se tu dici "prendi -1 e rappresentamelo con un char" il systema 
scrivera' 8 bit a 1 (come ti ho appena detto).
Fin qui nessun problema ... ma la variabile di cui sopra e' un carattere 
valido (come viene renderizzato dipende dal set di caratteri poi) e faresti 
confusione tra un char valido e la costante che indica che sei a fine file.
Ora, l'unico modo per impedire la confusione e' ritornare per EOF un valore 
che NON sia un char valido.
Infatti se fai il cast inverso (ovvero se usi solo degli int per 
rappresentare i valori di ritorno) ottieni questo:
qualunque char valido:
- 00000000 00000000 00000000 XXXXXXXX  (con al posto delle X 1 o 0)
EOF:
- 11111111 11111111 11111111 11111111
Ora non c'e' modo di fare confusione.
Spero che ti sia chiaro ora :)


 Spero che ti sia chiaro ora :)
Ora si, grazie 1000!!

Spiegazione impeccabile grazie MOX.
Ciao