Newsgroup: it.comp.lang.c
Titolo: [?]Esercizio della Bibbia

Salve , il codice quì sotto lo trascritto dalla Bibbia K&R , lo compilo con
djgpp su WinME
mi dà questo errore:
#include<stdio.h>
#define IN 1
#define OUT 0
int main (){
int state;
int nl=0; int nw=0;int nc=0; int c;
state=OUT
while((c=0;getchar())!=EOF;++c){
++nc;
if(c=='\n')++nl;
if(c==' ' || c=='\n' || c=='\t')
state=OUT;
else if(state==OUT){
state=IN;
++nw;}}
printf("%.0f %.0f %.0f\n", nl,nw,nc);
}/*graffa chiusura del main*/
(13)Error: parse error  before while
(22) Error:parse error before string costant
(22)Warning:: data definition has no type or storage class
Qualcuno puo darmi spiegazioni?
Grazie a tutti
Ciao  Roberto

 while((c=0;getchar())!=EOF;++c){
qui c'è qualche cosa che mi sfugge... non è che sia qualche cosa di simile a
for (c=0 ; getchar()!=EOF ; c++)
qui sarebbe la causa del "parse error before string costant". Forse hai
fatto qualche errore di trascrizione?
Riz

 while((c=0;getchar())!=EOF;++c)
while ( c=0; (c=getchar()) != EOF; c++ )
Non l'ho provato ma dovrebbe essere cosi'.
-- 
 Ciao, Bianco.
 Reply to luca.bianco (at) 
tiscalinet.it

 Non l'ho provato ma dovrebbe essere cosi'.
Si vede... 8-[
Scusa per il tono, ma fai prima un test poi posta (se non sei sicuro)
(hai aggiunto un errore [logic], oltre a quello [syntax] gia' esistente)...
quindi alcuni consigli per evitare errori:
- usare le graffette (all'inizio almeno  non sulla stessa riga del commando
che apre il blocco [if, else, while, do, for, <funzioni>,...) in
correspondenza
- indentare bene il testo (3 o 4 spazi di solito, ma anche con il tab)
- usare spazi prima di una parentesi aperta e dopo una parentesi chiusa
- mettere spazi dopo una virgola o punto virgola per dividere stetements e
parametri
- dividere la parte di dichiarazione variabili con la parte dei statement.
- ogni riga uno statement solo.
Questo solo per aumentare la leggibilita', dopodiche' e' tutto piu' facile
(capire errori di sintassi, posizione del debugger).
Ci sono altri consigli (nomi variabili, prototipi, usare enum,...), ma va
bene per ora...
// non testato, pero' sono sicuro (per la sintassi, non so di che parla
l'esercizio)
#include <stdio.h>
#define IN 1
#define OUT 0
int main (void)
{
    int state;
    int nl=0;
    int nw=0;
    int nc=0;
    int c;
    state=OUT;
    for (c=0; getchar()!=EOF; c++)
    {
        nc++;
        if (c=='\n')
            nl++;
        if (c==' ' || c=='\n' || c=='\t')
            state=OUT;
        else if (state==OUT)
        {
            state=IN;
            nw++;
        }
    }
    printf("%.0f %.0f %.0f\n", nl, nw, nc);
}
J.

 ha scritto nel messaggio
news:g6xj7.76796$TS4.5...@news2.tin.it...


 6 impazzito?
No, ma ho scritto cmq una cosa sbagliata ;-) Ho visto che nel ciclo
confrontava c con '\n', e quindi mi e' venuto automatico il c=getchar().
[...]
Se ho capito bene cosa fa il programma, ossia contare linee, parole e
caratteri, questa versione (testata) fa quello che deve fare:
#include <stdio.h>
#define IN 1
#define OUT 0
int main (void)
{
	int state;
	int nl=0;	/* numero linee */
	int nw=0;	/* numero parole */
	int nc=0;	/* numero caratteri */
	int c;		/* carattere corrente */
	state=OUT;
	for (nc=0; (c=getchar())!=EOF; nc++) {
		if (c=='\n')
			nl++;
		if (c==' ' || c=='\n' || c=='\t')
			state=OUT;
		else if (state==OUT) {
			state=IN;
			nw++;
		}
	}
	printf("%d %d %d\n", nl, nw, nc);
	return 0;


Ciao Roberto
Forse hai copiato male:
uso: prog.exe < file
------------------------------------------------------------------------------
#include <stdio.h>
#define IN 1
#define OUT 0
/* Conta linee, parole e caratteri nell'input */
main()
{int c, nl, nw, nc, state;
 state=OUT; nl=nw=nc=0;
 while((c= getchar())!= EOF)
      {++nc;
       if(c== '\n') ++nl;
       if(c== ' ' || c== '\n' || c== '\t') state=OUT;
       else if(state==OUT)
             {state=IN; ++nw; }
      }
 printf("caratteri=%d   parole=%d   linee=%d\n", nc, nw, nl);
}
------------------------------------------------------------------------------