Newsgroup: it.comp.lang.c
Titolo: conteggio di caratteri

Sul K&R c'è il seguente programma
/* Programma pagina 19 paragrafo 1.5.3 */
#include<stdio.h>
/* Conta i caratteri; prima versione */
main()
{
    long nc;
    nc = 0;
    while(getchar() != EOF)
    ++nc;
 printf("%ld\n", nc);
 }
ho provato ad eseguirlo ma quando inserisco una stringa e premo invio non mi
viene visualizzato il numero di caratteri che costituiscono la stringa....
anzi mi viene chiesto di inserire altri cartteri...
Voglio fare una precisione:
se inserisco
ciao
^z(ctrl z)
mi viene visualizzato 5 invece di 4.
Il tutto mi sembra un po strano...
ciao :-)
--------------------------------------------------------
Io posso indicarti la soglia sei tu che la devi attraversare

 ciao :-)
Ciau
Matic

 ha scritto nel messaggio
news:pan.2004.02.09....@hotmail.com...


si ho premuto invio e poi ctrl+z altrimenti non terminava... cmq mi sembra
strano che il K&R non abbia avvisato del fatto che bisognava digitare il
carattere di EOF... cmq se bisogna digitare obbligatoriamente il carttere di
EOF come e possibile che il programma qui sotto funzioni?
/* Programma pagina 16 paragrafo 1.5.1 */
#include<stdio.h>
/* Copia l'input sull'output */
main()
{
    int c;
    while ((c=getchar()) != EOF)
        putchar(c);
}
Qui il programma termina quando digito vari caratteri e premo invio... senza
far seguire il carattere di EOF alla stringa inserita.
Io credevo che se avessimo una stringa tipo
ciao
il carattere di EOF si travasse subito dopo la 'o' quindi
ciao'EOF'
dove EOF = -1
è cosi?
ciao
----------------------------
Non bisogna mai arrendersi

 e` cosi?
No. EOF *non* e` un carattere. EOF non  sarai mai scritto in nessun file
ed in  nessuna stringa. EOF  e` un valore  particolare, non  incluso nel
charset dell'implementazione (il suo  valore e` irrilevante, non pensare
che EOF == -1), che permette alla libreria di segnalare all'applicazione
la fine del file.
Luca
-- 
Home: 
http://kronoz.cjb.net
Mi piace avere amici rispettabili;
Mi piace essere il peggiore della compagnia.

> [...]digitare il carattere di EOF...
EOF non è un carattere, va un valore convenzionale, restituito dalle
funzioni di input per segnalare il termine del flusso dei caratteri
che si sta leggendo.

 che si sta leggendo.
vediamo se ho capito:
/* Programma pagina 16 paragrafo 1.5.1 */
#include<stdio.h>
/* Copia l'input sull'output; seconda versione */
main()
{
    int c;
    while ((c=getchar()) != EOF)
/*Il programma termina quando getchar() nel leggere(uno dopo  l'altro ) i
carattere digitati su stdin  incontra la CONDIZIONE di End Of File che non
corrisponde all' invio. Premendo invio infatti il programma mi chiede di
inserire altri carattere...*/
        putchar(c); /* stampa il carattere appena letto
da getchar()*/
}
ho stampato EOF con printf("%d", EOF), mi stampa -1:(
per quale motivo??
grazie, ciao ;-)
-----------------------------------------------------
I guerrieri non si arrendono mai. Io sono un guerriero

 per quale motivo??
Mettiamola in questi termini: a te viene assegnato il compito di
tirare fuori da una stanza tutte le scatole in essa contenute.  Puoi
tirare fuori una sola scatola alla volta.  Devi passare ogni scatola a
una persona a te vicina.  Ne tiri fuori una, ne tiri fuori l'altra e
l'altra ancora.  Le scatole finiscono.  Devi avvertire la persona che
ti sta accanto che nella stanza non ci sono più scatole.  Gridi
"Finite!".
Lo stesso fa getchar(), tira fuori i caratteri a uno alla volta e li
restituisce.
Quando non ce ne sono più grida "Finiti!", che nel suo linguaggio, in
questo caso, significa restituire -1.  EOF è una costante che, in
genere (perché in C non ci sono mai regole precise), vale -1, che è un
valore sicuramente inaccettabile come codice di un carattere letto e
quindi che consente di riconoscere la condizione di fine stream di
input da quella di lettura di un carattere.

 input da quella di lettura di un carattere.
Capito... Voglio domandare un ultima cosa riguarda EOF.
Stdin quindi è uno stream particolare perchè non ha mai la condizione di
EOF. Infatti è l' utente che deve digitarlo(ctrl-z o ctrl-d).
Negli stream collegati ad esempio ad un file di testo... l' EOF sarebbe la
fine di tutti i caratteri presenti nel file??... ; Questo è l' unico caso in
cui vi è l' EOF senza essere digitato dall'utente?
Grazie ^_*
-----------------------------
ciao-

 cui vi è l' EOF senza essere digitato dall'utente?
L'unico caso in cui EOF viene "segnalato" (non digitato) è il caso
della tastiera, che "pompa" caratteri sino a che tu non comunichi, in
qualche modo, che sono terminati.

 condizione: End Of File.
Per quello che ne so io, EOF non e' una particolare condizione.
E' una costante, memorizzabile in una variabile di tipo int, che rappresenta
la condizione di end-of-file.
Marcello
---
--
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.587 / Virus Database: 371 - Release Date: 12/02/2004

 genere (perché in C non ci sono mai regole precise), vale -1,
Per quel che ne so, vale -1 nella libreira GNU.


> Per quel che ne so, vale -1 nella libreira GNU.
Appunto, generalmente vale -1, ma non è detto che lo sia sempre.