Tutorial de Programación en C Parte 5 – Variables de carácter
En los dos tutoriales anteriores, hemos hablado de los fundamentos de las variables, incluyendo cómo ocupan la memoria. Pero nos hemos centrado principalmente en los enteros y los flotantes. En este tutorial, hablaremos de los caracteres (o variables de tipo char).
Las variables de tipo ‘char’ ocupan 1 byte (u 8 bits) en la memoria. Como he mencionado antes en el caso de ‘int’ y ‘float’, puedes comprobar la cantidad de memoria que ocupa un carácter en tu sistema utilizando el siguiente programa en C:
#include <stdio.h>
int main (void)
{
printf("\n sizeof char in bytes is %u", sizeof(char));
return 0;
}
En mi sistema, la salida fue la siguiente:
sizeof char in bytes is 1
Ahora viene la cuestión de cómo aceptar caracteres como entrada del usuario y cómo imprimirlos en la salida. Bien, para aceptar caracteres en la entrada, hay una función dedicada llamada ‘getchar’. Del mismo modo, para imprimir caracteres individuales, tienes ‘putchar’. El siguiente fragmento de código debería darte una mejor idea de cómo funcionan estas funciones:
#include <stdio.h>
int main (void)
{
int c;
c = getchar();
putchar(c);
return 0;
}
El código anterior, cuando se ejecuta, primero espera a que el usuario introduzca un carácter. Después, simplemente emite el mismo carácter en el terminal.
Puede ser un poco sorprendente para ti que el valor que devuelve ‘getchar’ se almacene en un entero, pero es así (la función devuelve un int). Pero siempre puedes comparar el valor devuelto por ‘getchar’ con un carácter. Aquí tienes un ejemplo:
#include <stdio.h>
int main (void)
{
int c;
c = getchar();
if(c == 'a')
{
printf("matched");
}
else
{
printf ("doesn't match");
}
return 0;
}
Aquí, si el usuario introduce ‘a’, el programa imprime en la salida ‘coincidente’. De lo contrario, verás ‘no coincide’.
Ah, y sí, es la primera vez que utilizamos las sentencias ‘if’ y ‘else’. Como ya habrás entendido, ‘if’ te permite ejecutar un conjunto de sentencias si una condición es verdadera. Cuando la condición ‘if’ falla, la ejecución del código entra automáticamente en el bloque ‘else’. Ten en cuenta que puedes utilizar una sentencia ‘if’ sin una sentencia ‘else’, pero lo contrario no es válido.
Ahora, volviendo a getchar y putchar, vamos a discutir rápidamente cómo se pueden utilizar estas funciones para resolver problemas de la vida real. Supongamos que quieres contar el número de líneas que un usuario proporcionó como entrada a tu programa, entonces puedes hacerlo de la siguiente manera:
#include <stdio.h>
int main (void)
{
int c =0, counter=0;
c = getchar();
while(c != EOF)
{
c = getchar();
if(c == '\n')
counter = counter+1;
}
printf("\n The input contains %d lines \n", counter+1);
return 0;
}
Para entender el programa anterior, primero debes saber qué es EOF. Bien, EOF significa Fin de Archivo. Se utiliza para indicar que el usuario ha terminado de introducir datos.
Así que cuando tú, como usuario que proporciona la entrada, has terminado con el proceso, pulsas ctrl+d (un par de veces). Esta acción es la que produce un valor equivalente al de EOF, que puede ser comprobado en el programa, tal y como hemos hecho.
Volviendo al programa, primero compruebas el primer carácter de entrada para ver si es EOF. Si no lo es, entras en el bucle while y compruebas continuamente cada carácter hasta obtener un EOF. Durante todo este proceso, cada vez que obtienes un carácter de nueva línea (\n), aumentas la variable ‘contador’.
Cuando se detecta un EOF, el bucle while se termina e imprimimos el número de líneas que supera el valor del contador.
La razón por la que añadimos uno a ‘contador’ en la función ‘printf’ es que el número de líneas es siempre uno más que el número de caracteres de nueva línea (o en términos sencillos, el número de veces que el usuario ha pulsado la tecla ‘Intro’). Por supuesto, esto supone que cada vez que el usuario pulsa «Enter», también introduce algún texto.
Así que si le das a este programa una entrada como la siguiente
Hello
Welcome to HowtoForge
Thanks
La salida sería:
The input contains 3 lines
Ten en cuenta que nuestro código asume que el usuario proporcionará al menos una línea. Hay un par de casos de esquina que no se manejan intencionadamente para simplificar las cosas. Uno es cuando el usuario proporciona EOF sin proporcionar ningún otro carácter en la entrada, y el otro es cuando se ha proporcionado una línea sin proporcionar un carácter de nueva línea.
El cálculo del número de líneas es sólo un ejemplo. También puedes ampliar este código para calcular el número total de palabras introducidas por el usuario. Considera esto como una tarea e intenta codificarlo tú mismo. Como pista, diría que consideres los espacios (‘ ‘) y los tabuladores (‘\t’), de forma similar a como consideramos las nuevas líneas (‘\n’) para calcular el número de líneas.
Conclusión
En este tutorial, hemos hablado un poco más de los caracteres, incluyendo cómo utilizarlos, aceptarlos como entrada e imprimirlos en la salida. También hemos hablado de un ejemplo en el que la función getchar nos ha ayudado a calcular el número de líneas en la entrada. Prueba la tarea que he dado en el último párrafo y hazme saber si tienes alguna duda o consulta.