PDA

View Full Version : [C] programma conteggio caratteri -non quadra-


karlettinos
04-08-2009, 10:27
Questo codice preso dal Kernighan doverbbe, secondo l'autore:

1) contare i caratteri digitati;
2) terminare il programma una volta finiti i caratteri immessi.

#include <stdio.h>
/*conta i caratteri*/
main()
{

int nc;
nc=0;

while (getchar()!=EOF)
++nc;
printf("%3d\n", nc);

}

Ma il risultato è questo:

MacBook-carlo:programmic carlo$ ./contchar1
kkkk
1
2
3
4
5

dove kkkk è la mia digitazione
e i numeri sono il conteggio.

Come si può notare i caratteri sono 4, e il conteggio ne rivela 5.
Poco male, si potrebbe impostare il contatore a -1.
Ma il problema è che dopo il quarto carattere getchar legge il carattere EOF (cioè la stringa è finita), ma invece di terminare ciclo e programma, come dichiarato dall'autore:

1) esegue ancora una volta il corpo del ciclo;
2) si posiziona ancora su getchar in attesa di nuovo input.

Infatti potete vedere che non è ricomparsa la riga di comando del terminale e dopo il 5 posso già digitare la nuova seq di carattere poichè il programma è ancora in funzione (cioè non è terminato).

Come faccio a realizzare un vero programma di conteggio caratteri che mi stampi solo il numero finale di caratteri e che termini il programma definitivamente?

Grazie a tutti!

Ciao!

k.

DanieleC88
04-08-2009, 10:44
Mi sa che lì ricevi anche il '\n' dell'invio: controlla che il carattere non sia '\n' prima di incrementare e stampare il numero di caratteri, così alla pressione di Ctrl + D (o Ctrl + Z, a seconda del tuo sistema operativo) il programma si chiuderà con il giusto numero di caratteri.

karlettinos
04-08-2009, 10:56
Mi sa che lì ricevi anche il '\n' dell'invio: controlla che il carattere non sia '\n' prima di incrementare e stampare il numero di caratteri, così alla pressione di Ctrl + D (o Ctrl + Z, a seconda del tuo sistema operativo) il programma si chiuderà con il giusto numero di caratteri.

Grande Daniele! Grazie mille!!

Nel codice ho sositutito EOF con \n:

#include <stdio.h>
/*conta i caratteri*/
main()
{

int nc;
nc=0;

while (getchar()!='\n')
++nc;
printf("%3d\n", nc);

}

e ora funziona perfettamente!

Mi sorge allora un dubbio: è meglio che butto il testo nel cestino???!:mad:

_Claudio
04-08-2009, 11:22
Mi sorge allora un dubbio: è meglio che butto il testo nel cestino???!:mad:

Se non ha specificato in quale set di caratteri e su quale sistema operativo funziona l'esempio direi proprio di sì.

DanieleC88
04-08-2009, 11:30
Be', molti considerano il K&R la "bibbia" del C, ma credo che sia più o meno vecchio quanto il linguaggio che tratta. Personalmente non saprei, ho sempre studiato i vari linguaggi senza libri, ma ho visto che all'università consigliano il Deitel, da un veloce sguardo mi sembra che tratti bene gli argomenti e che proponga esercizi "stuzzicanti". :D

ciao ;)

goldorak
04-08-2009, 12:38
Il C e' un linguaggio molto succinto, quindi il K&R va piu' che bene.
E molto conciso, ha degli esempi non banali ed e' un libro che si legge tranquillamente. 240 pagine di C distillato. :D
Le uniche cose che non tratta sono le aggiunte al C99, ma per questo bastano 10 pagine scarse e la documentazione si trova dappertutto.

88MIKI88
05-08-2009, 18:45
Il libro diciamo che a parte certi errori (che ho trovato pure io) mi sembra ben fatto e spieghi passo passo la programmazione in C.

wingman87
06-08-2009, 01:44
Il libro probabilmente come caratteri intende i char in generale e \n è effettivamente un char: quando hai digitato kkkk e poi invio non hai digitato solo kkkk ma anche invio, quindi è giusto che sia contato.