Quedó... pongo el código para a quien le sirva y para que "lo critíquen".
El ejercicio consiste en recivir una cadena, imprimirla en orden inverso intercalando Mayúsculas y mnúsculas, indicar su longitud y las vocales que contiene:
Código:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
main() {
char cadena[100], vocales[20]="aeiouAEIOUáéíóúÁÉÍÓÚ", to='m';
// cadena será donde guardaré lo tecleado por el usuario
// vocales lo manejaré como arreglo para buscarlas... ya no hice el toupper porque no hayé la forma para "convertir" las acentuadas.. así que mejor las tratamos igual
// to será una variable auxiliar para saber si la última LETRA fue mayúscula ó minúsculas
int i, j, voc=0, lg;
// i la ocuparé para desplazarme en cadena
// j para desplazarme en vocales
// voc será donde guardaré el total de vocales
// lg guardaré la longitud de la cadena
gets(cadena);
lg=strlen(cadena);
for(i=lg-1; i>=0; i++) { // decidí hacer un bucle inverso para aprobecharlo al imprimir y no hacerlo por aparte... ahorro de recusos ¿no?
if(isalpha(cadena[i])) { // solo si es LETRA... para casos como: "a A b5T!!!!i" que verdaderamente sea intercalar Mayus/minus
for(j=0; j<20; j++) {
if(cadena[i]==vocales[j]) { // si es vocal
voc++; // sumamos
break; // terminamos el ciclo... ahorro de recursos y aprovechamos su uso
}
if(to=='M') { // si la anterior fue mayúscula
cadena[i]= tolower(cadena[i]);
to='m'; // guardamos que ésta es minúscula SOLO SI SE HIZO EL CAMBIO
} else {
cadena[i]= toupper(cadena[i]);
to='M';
}
// Solo hemos hechos cambios a letras "normales".. las acentuadas no han cambiado... por lo que...
if (j>=10 && j<15 && to='M') // el rango de 'j' nos indica que es una letra minúscula acentuada y el 'to' nos indica si se "trato" de cambiarla... no por el simple hecho de que esté acentuada significa que se hará el cambio.
cadena[i]= vocales[j+5]; // su posición actual +5 nos da la misma letra en mayúscula
else if (j>=15 && j<20 && to='m')
cadena[i]= vocales[j-5]; // lo mismo pero al contrario
}
printf("%c", cadena[i]); // imprimos el último carácter que trabajamos...
}
printf("\nLongitud: %d\n", lg); // ya fuera del ciclo
printf("Vocales: %d\n", voc);
}
return 0;
}
Y listo... sin mayor ciencia.. espero no haberlo comentado demasiado y que dichos comentarios solo confundan en vez de explicar

... Bueno, notese que tube especial cuidado.. en cadenas que expliqué en los comentarios...
Preguntas: Por ahí tenia un error que se lo adjudiqué a la función isalpha() (por ello mi pregunta anterior), entionces la cambié por !isspace()... pero salió peor... ¿alguién podría explicarme ese comportamiento extraño??.. ejemplo: tal como esta ahora, solo cambiando isalpha() por !isspace()... y uno ingresa solo una "á" ... no la cuenta como vocal.. ¿por qué?... no es espacio, cumple la condición y debió de seguir un comportamiento normal...

.
Weereber.. Saludos a todos!