C – tipos conflictivos de error para la función

Soy nuevo en C. Intento obtener una gran cantidad de texto del usuario y contar el número de palabras, caracteres, líneas, espacios en blanco y letras. Esto es lo que he hecho:

#include  #include  int main(void) { char c = getchar(); char previousc; int charcount = 0; int wordcount = 0; int whitespacecount = 0; int linecount = 0; int lettercount = 0; while(c != EOF) { if(isLetter(c) == 1) lettercount++; if(isWhitespace(c) == 1) { whitespacecount++; if(isWhitespace(previousc) == 0) wordcount++; } if(c == "\n") linecount++; previousc = c; c = getchar(); charcount++; } printf("Character Count: %d\n Word Count: %d\n Whitespace Count: %d\n Letter Count: %d\n Line Count: %d\n", charcount, wordcount, whitespacecount, linecount, lettercount); } int isLetter(char c) // 1 for true, 0 for false. { // instead of writing tons of if's if(isalpha(c) > 0) return 1; return 0; } int isWhitespace(char c) // 1 for true, 0 for false. { if(c == "\n" || c == " " || c == " ") return 1; return 0; } 

Pero recibo tantos errores y advertencias que estoy perdido

 program2.c: In function 'main': program2.c:20: warning: comparison between pointer and integer program2.c: At top level: program2.c:28: error: conflicting types for 'isLetter' program2.c:28: note: an argument type that has a default promotion can't match an empty parameter name list declaration program2.c:14: error: previous implicit declaration of 'isLetter' was here program2.c:35: error: conflicting types for 'isWhitespace' program2.c:35: note: an argument type that has a default promotion can't match an empty parameter name list declaration program2.c:15: error: previous implicit declaration of 'isWhitespace' was here program2.c: In function 'isWhitespace': program2.c:36: warning: comparison between pointer and integer program2.c:36: warning: comparison between pointer and integer program2.c:36: warning: comparison between pointer and integer 

Busqué en Google los diferentes errores pero no encontré una solución que resuelva mi problema.

¿Puedes ayudarme un poco?

Gracias.

por

program2.c: 20: advertencia: comparación entre puntero y entero

Cambio

  if(c == "\n") 

a

  if(c == '\n') 

por

program2.c: 28: error: tipos en conflicto para ‘isLetter’
program2.c: 28: nota: un tipo de argumento que tiene una promoción predeterminada no puede coincidir con una statement de lista de nombres de parámetros vacía
program2.c: 14: error: la statement implícita anterior de ‘isLetter’ estaba aquí
program2.c: 35: error: tipos en conflicto para ‘isWhitespace’
program2.c: 35: nota: un tipo de argumento que tiene una promoción predeterminada no puede coincidir con una statement de lista de nombres de parámetros vacía program2.c: 15: error: la statement implícita anterior de ‘isWhitespace’ estaba aquí

Define prototipos para tus funciones.

 int isLetter(char c); int isWhitespace(char c); 

por

program2.c: en la función ‘isWhitespace’:
program2.c: 36: advertencia: comparación entre puntero y entero
program2.c: 36: advertencia: comparación entre puntero y entero
program2.c: 36: advertencia: comparación entre puntero y entero

Cambio

 if(c == "\n" || c == " " || c == " ") return 1; 

a

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

Comience con el primer error / advertencia, corríjalo y luego trabaje hacia abajo uno por uno, siempre comstackndo después de cada cambio. A menudo, encontrará, deshacerse de un error / advertencia en una línea también se deshace de otros en líneas subsiguientes.

Línea 20:

  if(c == "\n") linecount++; 

da la advertencia

 program2.c:20: warning: comparison between pointer and integer 

c es un char (convertido internamente en un entero antes de la comparación); "\n" es una matriz [2] de char (convertida internamente en char * antes de la comparación).
Es por eso que el comstackdor se queja de comparar un entero y un puntero.

Debe comparar c con un carácter (ambos se convertirán internamente en enteros)

  if(c == '\n') linecount++; 
  • Declare las siguientes funciones antes de llamarlas (es decir, arriba de la función main ):

    • int isLetter(char c);
    • int isWhitespace(char c);

  • En función main :

    • Reemplace la variable-statement char c con int c
    • Reemplace la función-llamada isLetter(c) con isLetter((char)c)
    • Reemplace la función-llamada isWhitespace(c) con isWhitespace((char)c)
    • Reemplace la asignación de variable previous = c con previous = (char)c
    • Reemplace la sentencia condicional if (c == "\n") con if ((char)c == '\n')

El motivo de int c , es que la función getchar devuelve int para que sea compatible con el indicador EOF .


  • En la función isWhitespace , cambie la sentencia condicional a:

    • if (c == ' ' || c == '\n' || c == '\r' || c == '\t')

EOF es un valor entero que indica el final de la entrada. Es un valor tal que para cualquier carácter ch , ch == EOF siempre es falso. Por lo tanto, siempre debe comparar un valor de tipo int con EOF , no tipo char . Está funcionando en su máquina porque el tipo char se implementa como signed char pero en las máquinas donde char type es unsigned char , esto no funcionará.

Ahora llegando a las advertencias y errores.

  1. El scope de una función es desde el punto de su definición o statement hasta el final del progtwig. Está llamando a las funciones como isLetter en main antes de que hayan sido declaradas.

  2. "\n" es una cadena literal, no un carácter. Así son " " y " " . La cadena literal aquí se evalúa como un puntero a su primer elemento y usted está comparando este puntero con un carácter, un tipo diferente. En su lugar, debe comparar con '\n' , ' ' , '\t' respectivamente.

tiene que declarar el encabezado de la función antes de usarlo en la pantalla principal, por ejemplo:

 int isLetter(char c); int main(void){ char c = getchar(); char previousc; int charcount = 0; int wordcount = 0; int whitespacecount = 0; int linecount = 0; int lettercount = 0; while(c != EOF) { if(isLetter(c) == 1) lettercount++; if(isWhitespace(c) == 1) { whitespacecount++; if(isWhitespace(previousc) == 0) wordcount++; } if(c == "\n") linecount++; previousc = c; c = getchar(); charcount++; } printf("Character Count: %d\n Word Count: %d\n Whitespace Count: %d\n Letter Count: %d\n Line Count: %d\n", charcount, wordcount, whitespacecount, linecount, lettercount);} 

que solucionará el error de tipos en conflicto. pero también tendrá que cambiar “” a ” si está verificando los caracteres.