En este post de programación en ANSI C o simplemente lenguaje C vamos a ver cómo tener una cadena dinámica que crece su tamaño sin ningún límite (más allá de la RAM).
Esto es, dicho de otra manera, una string dinámica a la que se le pueden concatenar más cadenas y va a crecer su tamaño según sea requerido.
Como bien sabes, las cadenas en C son arreglos de tipo char que tienen el carácter nulo en la última posición, y son de longitud fija.
Gracias a los apuntadores, estructuras y funciones como malloc
o realloc
podemos aumentar la memoria que una variable usa, logrando así tener una cadena dinámica en C a la que le puedes concatenar otros strings sin límite.
Estructura de la cadena dinámica en C
Necesitamos dos cosas para que esto funcione: el arreglo en sí, que será la cadena dinámica, y una variable para guardar la longitud de la cadena. Entonces definimos una estructura de la siguiente manera:
Ahora inicializamos un struct estableciendo su longitud en cero pero sus datos como un arreglo de longitud 1 que solo tendrá el carácter nulo al final, quedando así:
Aquí tenemos la primera llamada a malloc
, y es que vamos a definir nuestra cadena dinámica usando simplemente un arreglo de caracteres al que accederemos usando aritmética de punteros.
Aumentar tamaño de cadena y concatenar
Una vez iniciada, veamos la función por la que seguramente estás aquí: función para concatenar una cadena en C aumentando su tamaño. Queda así:
Aquí está todo lo interesante para aumentar el tamaño de la cadena y concatenar los nuevos datos. Como puedes ver estoy usando realloc
para requerir más memoria a la cadena previamente alojada en la RAM, así como memcpy
para concatenar los datos.
Modo de uso
Finalmente veamos cómo concatenar cadenas en C sin límite. Solo debes invocar a la función concatenar
cuantas veces sea necesario, pasando el apuntador a la cadena y la cadena que quieres concatenar como segundo argumento.
No te olvides de liberar la memoria con free
al finalizar tu programa.
Compilación
Por cierto, vas a necesitar las librerías stdio.h
, string.h
y stdlib.h
. En este caso usamos string.h
solo para calcular la longitud de una cadena, pero siempre puedes usar otras alternativas.
Yo lo he compilado con MSYS2 usando gcc concatenar.c -Wall -o concatenar.exe
y luego ejecutando concatenar.exe
. Si te sirve, aquí hay un vídeo explicando todo lo del post: