Una ayudita con c y comparación de chars

Buenas, tengo que hacer un ejercicio que pide lo siguiente:
Escribir un programa que recibe por teclado diez caracteres de uno en uno, que admite letras,
dígitos (‘0’..’9’), espacios en blanco, etc. y calcula y visualiza por pantalla:
- Número de letras que se han introducido.
- Número de dígitos que se han introducido.
- Número de espacios en blanco.
- Número de vocales.
- Número de caracteres que no son letras, ni dígitos, ni espacios en blanco.


Y lo he planteado así:
#include <stdio.h>

main(){
   char digits[10],lost;
   int n,i=0,let=0,dig=0,std=0,voc=0,other=0;
   
   for (n=0;n<10;n++){
      printf("Introduzca un caracter: ");
      scanf("%c",&digits[i]);
      scanf("%c",&lost);
      i++;
   }
   for (i=0;i<10;i++){
      if (48<=digits[i]<=57)
         dig++;
      else if(97<=digits[i]<=122)
         let++;
      else if(digits[i]==160)
         std++;
      else if((digits[i]==97)||(digits[i]==101)||(digits[i]==105)||(digits[i]==111)||(digits[i]==117))
         voc++;
      else
         other++;
   }
   printf("Ha introducido %d vocales %d digitos %d letras %d espacios y %d irreconocidos",voc,dig,let,std,other);


PERO SIEMPRE,SIEMPRE, me salen 10 digitos, ponga lo que le ponga. ¿Alguna idea?
El problema lo tienes en las condiciones de los if, por el valor de los booleanos en C las comparaciones no resultan como esperas.

"a <= b <= c" equivale a "(a <= b) <= c".

"a <= b" será verdad o falso. En C, falso es 0, y true es cualquier otro número, generalmente 1. Dependiendo de si "a <= b" se cumple o no, la siguiente comparación que se hará será "1 <= c" o " 0 <= c".

Concretando en tu caso, "48<=digits[i]<=57", entonces "(0 ó 1) <= 57", se cumple siempre, por eso te sale ese resultado, no pasa del primer if. Si quieres comprobar el valor de "48 <= digits[i]" puedes usar un printf: printf("%d\n", 48 <= digits[i]);

La solución será cambiar todas las condiciones del if: if (48 <= digits[i] && digits[i] <= 57){...

También podrías ponerlo así, resulta más legible: if ('0' <= digits[i] && digits[i] <= '9'){...
Muchisimas gracias tio, ahora sí, además he puesto el if de las vocales dentro de las letras para que sume voc y let si se cumple y solo let si no se cumple. Gracias!
2 respuestas