Contando nuevas líneas, espacios y tabs.

Este problema es de K&R p. 20: Escriba un progtwig para contar los espacios en blanco, las tabs y las nuevas líneas.

Aquí está mi bash:

#include  int main() { int character, whitespace = 0; printf("Enter some text, and press Ctrl-d when you're done.\n\n"); while((character = getchar() != EOF) { if(character == (' ' || '\n' || '\t')) { ++whitespace; } } printf("\nYour text contains %d spaces, tabs, and lines.\n", whitespace); return 0; } 

El progtwig no funciona. Siempre da la respuesta 0 sin importar cuántos espacios, tabs y líneas nuevas contenga el texto del usuario. ¿Alguien puede ver el problema? Hay otra cosa extraña: tengo que presionar Ctrl-d dos veces para que se registre. No tengo ni idea de porqué. ¡Gracias!

 if(character == (' ' || '\n' || '\t')) 

comprueba si el character es igual al resultado de (' ' || '\n' || '\t') (el resultado de esto es 1, lo que indica que el resultado de || es verdadero). Debe probarlo individualmente contra cada uno de los tres valores posibles, por ejemplo,

 if(character == ' ' || character == '\n' || character == '\t') 

Uno de los problemas que podría estar afectando es su condición.

Intenta algo como:

 if (character == '\n' || character == ' ' || character == '\t') { ++ whitespace; } 

El paréntesis en su sentencia while es incorrecto, debería ser

 while( (character = getchar()) != EOF) 

Usted asignó al carácter el valor de la prueba getchar() != EOF que es 1 para cualquier carácter que se haya leído realmente.

el problema con su código es if(character == (' ' || '\n' || '\t')) statement. La statement (' ' || '\n' || '\t') es equivalente a 32 || 13 || 9 32 || 13 || 9 32 || 13 || 9 (cada carácter reemplazado por su valor ASCII equivalente) que es igual a 1 ya que cualquier cosa que no sea cero se considera true en C / C ++, así que efectivamente lo estás haciendo if(character == 1) . Ahora creo que puedes solucionar el problema en tu código.

Además, los libros dicen que se deben contar los espacios en blanco, las tabs y las líneas nuevas por separado y usted está intentando contar los números totales, así que haga algo como esto.

 if(character == ' ') ++blanks; if(character == '\t') ++tabs; if(character == '\n') ++newlines; 

Si desea una solución completa, aquí hay una que escribí hace mucho tiempo.

 #include  int main(void) { int blanks, tabs, newlines; int c; blanks = 0; tabs = 0; newlines = 0; do { c = getchar(); if(c == ' ') { ++blanks; } else if(c == '\t') { ++tabs; } else if(c == '\n') { ++newlines; } } while(c != EOF) printf("Blanks: %d\nTabs: %d\nLines: %d\n", blanks, tabs, newlines); return 0; } 

isspace estará disponible como una macro o función dependiendo de su sistema y le ahorra tener que adivinar lo que podría constituir un espacio en blanco en su entorno. Estrictamente hablando, puede ser todos los siguientes caracteres en su sistema. GNU C ciertamente lo cree.

 ' ' space '\f' formfeed '\n' newline '\r' carriage return '\t' horizontal tab '\v' vertical tab 

Así es como puedes hacer la prueba.

  #include  while((character = getchar() != EOF) { if (isspace(character)) whitespace++; } 

Los ejemplos anteriores son técnicamente correctos. Imprime los valores solo después de que se llama a un indicador EOF (Fin de archivo). Sin embargo, creo que hay una mejor explicación de este ejercicio (1.8), así que permítanme proponer una alternativa. El siguiente código imprimirá las nuevas líneas, tabs y espacios en blanco justo después de cada nueva línea.

 #include  #define EOL '\n' /* Excercise 1.8 - K&R's book - 2nd edition. */ main() { int c, newlines, tabs, blanks; newlines = 0; tabs = 0; blanks = 0; while ((c = getchar()) != EOF) { if (c == '\n') ++newlines; else if (c == '\t') ++tabs; else if (c == ' ') ++blanks; if (c == EOL) { printf("Lines: %d\nTabs: %d\nBlanks: %d\n", newlines, tabs, blanks); } } }