Hay muchas formas de resolverlo. Una muy intuitiva puede ser usar una variable "char" y ver si esa variable pertenece a un rango. Por ejemplo:
Código:
#include <stdio.h>
#include <string.h>
void main (void)
{
char c;
int i;
char *texto;
texto="Hola como estas? son las 19:24. Espero que este ejemplo te ayude";
for(i=0; i<strlen(texto); i++){
c=texto[i];
if ((c>=0x30)&&(c<=0x39)){
printf("numero ");
}
else if ((c>=0x41)&&(c<=0x5A)){
printf("mayuscula ");
}
else if((c>=0x61)&&(c<=0x7A)){
printf("minuscula ");
}
else{
printf("%c", c);
}
}
}
En el caso de un Switch-case, puedes crear una variable "entera" de forma que almacene un valor según el rango al que pertenece el caracter leido:
Código:
int val;
if ((c>=0x30)&&(c<=0x39)){
val=0; //val=0 significará que el caracter es un número.
}
else if ((c>=0x41)&&(c<=0x5A)){
al=1; //val=1 significa que se trata de una letra mayúscula.
}
...etc...
y luego preguntas por "val" en el switch:
Código:
switch (val){
case 0: printf("Número");
break;
case 2: printf("minuscula");
break;
...etc...
Existen otras técnicas un poco más complejas, basadas en asignar valores a los tokens generados mediante expresiones regulares.
De todas formas si es por conocimiento bien, pero existen herramientas como Flex para implementar reglas léxicas, simplemente escribiendo las expresiones regulares que definan el lenguaje. Del mismo modo herramientas como Cup, permiten generar gramáticas para describir lenguajes independientes del contexto. Combinando el analizador léxico y sintáctico (combinar expresiones regulares con una gramática), podrías construir un parser para textos con un formato de manera rápida y sencilla.
Un saludo.
Marcadores