¡Hoy amaneció entretenido el foro, muchas dudas, jeje! Ahora mis observaciones. En primer lugar, el uso de
getch() (en sistemas Windows) requiere la cabecera <conio.h>
En cuánto a la función de pedir dato, no requieres una cadena auxiliar s [que por cierto en tal caso debería ser declarada como
char * y no
char], pues gets() debe depositar su dato directamente el frase:
void pedir_datos (char frase[])
{
printf("Introduce una frase: \n");
gets(frase);
}
Debes tener cuidado porque en el
main(), el arreglo
frase debe tener la longitud suficiente para contener cualquier cadena que introduzca el usuario, de lo contrario ocurriría un desbordamiento de memoria. En tu caso, al haber declarado con longitud de 100 creo que está bien (aunque hay maneras más seguras de hacerlo pero no voy a distraerte el tema con eso).
La función toUpperCase() recorre la cadena, restando 32 al código ASCII de cada carácter encontrado, así pasa de minúscula a mayúscula. Una alternativa es usar la función de biblioteca toupper(c), que pasa el carácter c a mayúsculas (requiere la cabecera <ctype.h>). Por cierto, declara el tipo de s en tu código como char * (apuntador a carácter), e inicialízalo al primer caraćter de la cadena. Si no lo inicializas, el compilador tomará un valor por defecto, generalmente cero, y por eso falla tu programa:
void toUpperCase(char frase[])
{
char * s = frase;
for( ; *s!='\0'; s++)
if( *s >= 'a' && *s <= 'z')
*s -= (char)32;
}
Te explico: s es un apuntador a carácter, o lo que es lo mismo, una cadena en C. Ojo, que s no es el valor del carácter sino un apuntador al mismo. El valor de la letra sería
*s. Por eso cambiamos s por
*s en tu código, y tras la inspección de cada letra incrementa el apuntador para que "apunte" a la siguiente letra de la cadena. Por eso es
++s (y no
++*s, se incrementa el apuntador, no el valor apuntado, era otro error que tenías). La función de minúsculas quedaría similar:
void toLowerCase(char frase[])
{
char * s = frase;
for( ; *s!='\0'; s++)
if( *s >= 'A' && *s <= 'Z')
*s += (char)32;
}
Como aditamento (nunca está de más una segunda opción, jeje), una forma de hacer lo mismo con la función de biblioteca
toupper() sería:
void toUpperCase(char frase[])
{
char * s = frase;
for( ; *s!='\0'; s++)
*s = toupper( *s );
}
La salida, en cualquier caso, es la misma:
Introduce una frase:
holA Mundo
Frase original: holA Mundo
holA Mundo
Mayuscula: HOLA MUNDO
Minuscula: hola mundo