Newsgroup: it.comp.lang.c
Titolo: [getchar e putchar] Elementare programma in C, errori

Sono all'inizio dell'apprendimento del linguaggio C e sto seguendo il
manuale di Kernighan e Ritchie ("Linguaggio C - ANSI C, seconda edizione"
della Jackson Libri, 1989).
Volendo mettere in pratica gli esempi descritti nel testo, e non sapendo in
che altro modo fare, utilizzo Visual C++ 6 della M$ (se sto sbagliando
qualcosa ditemi pure...).
Utilizzo il wizard fornito dal prg in questione, per la creazione di una
Console Application (è giusto fare così? sono arrivato a questa soluzione
procedendo per tentativi...) e scrivo questo semplice programma, che
dovrebbe servire a far apparire a video quando sto digitando sulla tastiera.
#include "stdafx.h"     /*che a sua volta include stdio.h*/
/*copia l'input sull'output*/
main()
{
 int c;
 while ((c = getchar()) != EOF)
  putchar (c);
}
OK! il mio primo programma in C! che emozione! infatti compare una finestra
DOS dove posso scrivere e cancellare del testo.
Per terminare il programma c0è quella valutazione dell'EOF che in stdio.h è
definito -1, per cui provo a sostituirlo con 97 (codice ASCII della lettera
"a").
Eseguo il programma e alla pressione della lettera "a" non succede un
beneamato ca##o. Ah! mi sembrava troppo facile!
Per ulteriore prova sostituisco
    putchar (c);
con
    putchar (c + 1);
e nulla cambia: quando digito una "z", a video compare proprio una "z".
Ora vi chiedo: dove sto sbagliando???
TIA
Mauro.
   - - -       - - -       - - -
"Non è morto ciò che in eterno può attendere,
e col passar di strane ere, anche la morte muore."
H. P. Lovecraft, The Nameless City (1921), in Weird Tales, novembre 1938.

"a").
No.
EOF e' una costante che ha senso solo internamente all'applicazione.
Cioe', quando in input viene riconosciuto l'End Of File, allora viene
passato all'applicazione il valore -1.  Ma EOF, teoricamente, puo'
valere qualsiasi numero. Si sceglie -1 per convenienza.
Premi CTRL+Z alla fine dell'input, genererai il codice ascii 26 che
sotto DOS/Windows viene riconosciuto come End Of File.

per utte le funzioni tipo getchar, scanf, et similia, che leggono dallo
stream di ingresso, devi tener presente un particolare funzionamento del
DOS, che fa si che quello che tu scrivi non venga in realta' passato al tuo
programma se non dopo che hai premuto invio.
Questo vuol dire che i caratteri che vedi in echo a video non e' la tua
putchar a scriverli ma sempre il DOS, prova a premere anche invio e vedrai
sotto il tuo input la linea ripetuta (questa volta e' scritta dalla tua
putchar)
In DOS il carattere EOF e' la combinazione di tasti CTRL+Z.
ciao
donCiccio

 Ora vi chiedo: dove sto sbagliando???
Mi vengono in mente 2 ipotesi:
1) Non ricompili il programma
2) Non premi enter
L'input da tastiera ( e a volte l'output ) viene bufferizzato; per cui fino 
a che il buffer non viene svuotato non ti accorgi di nulla. Se e' giusta 
questa mia ipotesi il programma dovrebbe farti vedere la stringa che hai 
inserito una seconda volta dopo che hai premuto enter:
in pratica
<inserisci la stringa nel buffer><premi ENTER>
   |
   V
<Viene passato un carattere alla volta del buffer al programma>
<il programma conb putchar( ) riempie il buffer di output >
   |
   V
<il buffer di output viene riversato su schermo>
I flush dei buffer sono molto OS dependent; in genere quello di input si 
"svuota" alla pressione del return; quello di output e' immediata ( sto 
considerando che l'output e' su console )

 sotto DOS/Windows viene riconosciuto come End Of File.
e infatti č proprio cosě.
Grazie a tutti per i contributi: ora č tutto piů chiaro!
Mauro.
   - - -       - - -       - - -
"Non č morto ciň che in eterno puň attendere,
