Obtener valor entero a partir de dígito hexadecimal en C

Como sabemos, los números hexadecimales se representan con 16 dígitos; por eso son base 16. Para eso se usan los números del 0 al 9 y las letras de la A a la F.

Pero esas letras tienen un valor en decimal, la A tiene el valor de 10, la B de 11 y así hasta que la F tiene 15. Pues justamente hoy veremos cómo obtener ese valor decimal o entero a partir de un carácter hexadecimal.

La función debe quedar de tal forma que si le pasamos una ‘A’ devolverá un 10; o si le pasamos un ‘1’ devolverá 1.

(más…)

Leer datos por teclado en C utilizando scanf

Este post es muy básico pero nos enseña cómo leer una variable dada por un usuario en C utilizando la función scanf. Con esta función podemos leer cualquier tipo de dato, siempre y cuando especifiquemos su tipo correctamente.

La función

Se llama scanf porque escanea según un formato. Como primer argumento recibe el formato (una cadena) y como segundo argumento la dirección de memoria en donde pondrá el valor leído.

Dicha función para leer datos por teclado en C está en la librería stdio.h, lo único que debemos de hacer es incluirla con #include <stdio.h>.

(más…)

Usar fgets en lugar de scanf en C

Cuando aprendemos algoritmos en C, la forma de escanear variables por teclado es a través de scanf. Si bien este método funciona, existe el peligro de un desbordamiento de búfer.

Antes que nada te invito a ver lo que es un desbordamiento de búfer en C.

fgets vs scanf en C

Después de que leíste lo del desbordamiento es hora de ver por qué es mejor usar fgets en lugar de scanf. Esto es porque fgets escanea una variable pero únicamente hasta donde le digamos; es decir, nosotros le decimos cuánto debe leer (el tamaño).

Scanf en cambio no hace eso, lee todo dentro de la posición en memoria.

(más…)

Desbordamiento de búfer en C

Hoy veremos lo que es un desbordamiento de búfer en C y cómo puede (en su forma más simple) hacer que un usuario aproveche esa vulnerabilidad para explotar nuestro programa.

Nota: esto es diferente a cuando se desborda una variable.

Lo que es un desbordamiento de búfer

Según la Wikipedia:

En seguridad informática y programación, un desbordamiento de búfer (del inglés buffer overflow o buffer overrun) es un error de software que se produce cuando un programa no controla adecuadamente la cantidad de datos que se copian sobre un área de memoria reservada a tal efecto (buffer): Si dicha cantidad es superior a la capacidad preasignada, los bytes sobrantes se almacenan en zonas de memoria adyacentes, sobrescribiendo su contenido original, que probablemente pertenecían a datos o código almacenados en memoria. Esto constituye un fallo de programación.

En otras palabras le da al usuario de nuestro programa la forma de sobrescribir una variable a su antojo; bueno, no siempre y no tan fácil, pero alguien con tiempo puede encontrarlas y explotarlas.

Esto es peligroso en programas que se van para producción, por ejemplo un sistema de la apertura de una puerta o cosas de esas que tienen que ver con la seguridad.

(más…)

Invertir cadena en C

Voltear cadena en C

Girar, rotar, voltear o invertir una cadena en C es una cosa fácil de hacer, aunque no tan fácil como en otros lenguajes de programación.

El algoritmo es sencillo, recordemos que las cadenas en C son simples arreglos de caracteres. Así que tenemos que ir desde el inicio hasta la mitad de la cadena, rotando carácter por carácter.

(más…)

Código C formateado

Formatear código C online

Hacer que nuestro código se vea y lea bien usando una herramienta online

En cualquier lenguaje de programación que he probado siempre he querido que el código se vea bien. Algunos poderosos IDE’s traen el autoformato automático para determinados lenguajes; por ejemplo, VSCode formatea el código JavaScript.

Si queremos programar en otro lenguaje (como C) y embellecer nuestro código sin instalar nada, podemos hacerlo con una herramienta online.

(más…)

Contar frecuencia de palabras que el usuario introduce

Contar frecuencia de palabras en C

Realizar conteo de ocurrencias de palabras en una oración con C

Ya estamos aquí con otro tutorial de C. Lo que haremos ahora será analizar una cadena o string, contar las palabras que tiene (ignorando puntos, espacios y signos) y luego agruparlas para indicar la frecuencia con la que se repiten.

Este ejercicio puede resolverse de varias maneras pero yo he decidido hacerlo a través de una pila en donde almacenaremos structs. Aquí puedes ver un ejemplo de una pila de enteros, la modificaremos un poco para que funcione con structs.

¿Por qué una pila en lugar de un arreglo? muy fácil, porque la pila puede tener un tamaño infinito.

Al final generaremos una tabla como la que se ve en la imagen (aunque la frecuencia es 1 en la mayoría de veces, la función trabaja bien; el problema fue que la cadena de prueba no tenía muchas palabras repetidas):

Contar frecuencia de palabras de una oración con C

Contar frecuencia de palabras de una oración con C

 

(más…)

Separar cadena a partir de delimitadores en C con strtok

Dividir cadena en C por cada espacio, guión, coma, entre otros

En C no existe la función split como en otros lenguajes; en donde simplemente ponemos un delimitador y nos devuelve un arreglo; pero tenemos una función que incluso puede ser más poderosa. Esta función de la que hablo (la cual se llama strtok) nos permitirá dividir una cadena usando un delimitador; por ejemplo una coma.

A partir de una cadena, podemos usar delimitadores para obtener tokens. Pongamos a la cadena “Hola, qué tal. Vamos a programar en C”; si la separamos usando el espacio, las comillas y los signos de puntuación obtendríamos las palabras limpias.

Por poner otro ejemplo, dada una lista delimitada por comas podemos obtener sus elementos. De “Juan,Pedro,María,Rosa” podemos obtener 4 nombres; usando la coma como delimitador.

(más…)

Pila dinámica en C

Implementación de una pila dinámica en C

Pila o stack dinámica en el lenguaje C

Una pila es una estructura de datos simple. Los datos se van apilando uno tras otro. Podemos abstraer cada elemento como un nodo que puede apuntar a otro nodo.

Su modo de acceso es LIFO: el último en entrar es el primero en salir. Las operaciones que tiene son 2: push y pop; la primera le pone un elemento y la segunda quita el último.

Pila dinámica en C

Pila dinámica en C

Veremos las operaciones básicas de una pila o stack en C; además de otras que hice para exponer aquí. Son:

  • Tamaño: devolver el tamaño de la pila
  • Apilar, también conocido como push: agregar un elemento
  • Desapilar, o la operación pop: quitar el último elemento; es decir, el elemento superior
  • Leer último: leer el elemento superior de la pila
  • Vacía: indica si la pila está vacía
  • Imprimir: recorrer la pila e imprimir sus valores

Por cierto, esta pila será dinámica: podremos poner elementos infinitos siempre y cuando nuestra memoria RAM alcance (cosa que es muy, muy difícil que ocurra)

(más…)

Booleanos en C

Tipo de dato bool en C

En el inicio de los tiempos, el lenguaje de programación C no tenía el tipo de dato booleano. De hecho, ni siquiera hoy en día lo tiene como tal, es un simple macro.

Sin embargo, como programadores nos hemos dado a la tarea de implementarlos o de emular su uso. Veamos hoy cómo podemos implementar booleanos en C de dos maneras, analizando ventajas y desventajas de cada uso, así como exponiendo ejemplos.

(más…)

Búsqueda binaria en arreglos de cadena con C

Búsqueda binaria en arreglos de cadenas con C

Introducción

Esto es el complemento a la entrada publicada anteriormente sobre la búsqueda binaria en C sobre arreglos de números. Ahí buscamos en arreglos de números, ahora nos toca buscar en arreglos de cadenas. Igualmente aplicaremos la forma recursiva y con el ciclo while.

Los arreglos de cadenas son una cosa un poco complicada al inicio, sobre todo en este lenguaje. Por eso te invito a que leas cómo trabajar con arreglos de cadenas en C.

(más…)