¿Por qué mi implementación de wc está desactivada por una palabra?

[Resuelto] Escribir código de análisis es una trampa. Una línea con 15 espacios tendrá 15 palabras. Las líneas en blanco también contarán como una palabra. Volver a flexionar y bisonte para mí.

#include  #include  int main(int argc, char *argv[]) { FILE *fp = NULL; int iChars =0, iWords =0, iLines =0; int ch; /* if there is a command line arg, then try to open it as the file otherwise, use stdin */ fp = stdin; if (argc == 2) { fp = fopen(argv[1],"r"); if (fp == NULL) { fprintf(stderr,"Unable to open file %s. Exiting.\n",argv[1]); exit(1); } } /* read until the end of file, counting chars, words, lines */ while ((ch = fgetc(fp)) != EOF) { if (ch == '\n') { iWords++; iLines++; } if (ch == '\t' || ch == ' ') { iWords++; } iChars++; } /* all done. If the input file was not stdin, close it*/ if (fp != stdin) { fclose(fp); } printf("chars: %d,\twords: %d,\tlines: %d.\n",iChars,iWords,iLines); } 

DATOS DE PRUEBA foo.sh

 #!/home/ojblass/source/bashcrypt/a.out This is line 1 This is line 2 This is line 3 

ojblass @ linux-rjxl: ~ / source / bashcrypt> wc foo.sh

5 13 85 foo.sh

ojblass @ linux-rjxl: ~ / source / bashcrypt> a.out foo.sh

caracteres: 85, palabras: 14, líneas: 5.

Estás contando \ n como una palabra incluso para una línea en blanco.

Tu algoritmo está equivocado Si tiene en el archivo de prueba 2 caracteres en blanco seguidos, el contador de palabras se incrementará dos veces, pero solo se incrementará una vez.

Una solución será recordar el último carácter leído. Si el carácter leído es un carácter especial (en blanco, nueva línea, …) y el carácter anterior es alfanumérico, se incrementa el contador de palabras.