Hoy veremos un ejercicio de trabajo con cadenas o strings en C. Se trata de ver una función para insertar una cadena dentro de otra cadena, en cualquier posición.
Es decir, colocar una substring en una string de C. Como sabemos, las cadenas en C son un dolor de cabeza.
Durante la madrugada estuve trabajando en una función que hace exactamente eso y la vengo a compartir.
Algoritmo para insertar cadena en subcadena
Como sabemos, las cadenas son complejas de manejar en C. Por lo tanto la función que he creado requiere que definamos una máxima longitud de cadena.
Comenzamos definiendo el encabezado, que recibe la cadena original (en donde se va a insertar la otra cadena), la cadena que se inserta y la posición en la que se inserta.
void insertarSubcadena(char *original, char *subcadena, int indice);
Con esta función vamos a poder insertar una cadena al inicio, al final o en el centro, haciendo la cadena más grande como se debe. Por cierto, la función modifica a la cadena original.
Después de eso definimos el inicio de la cadena en una cadena vacía y copiamos a inicio
la primer parte de la cadena, desde el inicio
hasta la posición:
// El inicio es copiar la original N caracteres definidos por posición
char inicio[MAXIMA_LONGITUD] = "";
strncpy(inicio, original, indice);
Ahora definimos el final,
que es copiar desde el índice en donde se inserta hasta el final:
char fin[MAXIMA_LONGITUD] = "";
strncpy(fin, original + indice, strlen(original) - indice);
En este momento ya tenemos separados el inicio y final de la cadena, ahora falta insertar la subcadena que irá “en el centro”:
// Agregar la subcadena al inicio
strcat(inicio, subcadena);
Ahora ya tenemos el inicio y la subcadena, falta agregar el final:
// Y agregar el fin a la anterior cadena, es decir, al inicio
strcat(inicio, fin);
Finalmente copiamos el inicio (que tiene en este momento toda la cadena lista) a la cadena original:
// Copiarla dentro de la cadena recibida
strcpy(original, inicio);
Función insertar cadena en otra cadena usando C
Ahora la función completa queda así:
#define MAXIMA_LONGITUD 100
void insertarSubcadena(char *original, char *subcadena, int indice) {
// El inicio es copiar la original N caracteres definidos por posición
char inicio[MAXIMA_LONGITUD] = "";
strncpy(inicio, original, indice);
// El final es copiar desde la posición N caracteres definidos por los sobrantes
char fin[MAXIMA_LONGITUD] = "";
strncpy(fin, original + indice, strlen(original) - indice);
// Agregar la subcadena al inicio
strcat(inicio, subcadena);
// Y agregar el fin a la anterior cadena, es decir, al inicio
strcat(inicio, fin);
// Copiarla dentro de la cadena recibida
strcpy(original, inicio);
}
Como lo dije, modificará la cadena original.
Probando función
Podemos probar la función con el siguiente código dentro del método main
:
int main() {
// Vamos a formar "Luis Cabrera"
char nombre[] = "us";
printf("Antes: %s\n", nombre);
// Insertamos la L al inicio
insertarSubcadena(nombre, "L", 0);
printf("Después: %s\n", nombre);
// La i en penúltimo lugar
insertarSubcadena(nombre, "i", 2);
printf("Después: %s\n", nombre);
// Ahora " Cabrera" al final
insertarSubcadena(nombre, " Cabrera", 4);
printf("Después: %s\n", nombre);
return EXIT_SUCCESS;
}
Y el código completo quedaría así:
/*
____ _____ _ _ _
| _ \ | __ \ (_) | | |
| |_) |_ _ | |__) |_ _ _ __ _____| |__ _ _| |_ ___
| _ <| | | | | ___/ _` | '__|_ / | '_ \| | | | __/ _ \
| |_) | |_| | | | | (_| | | / /| | |_) | |_| | || __/
|____/ \__, | |_| \__,_|_| /___|_|_.__/ \__, |\__\___|
__/ | __/ |
|___/ |___/
Blog: https://parzibyte.me/blog
Ayuda: https://parzibyte.me/blog/contrataciones-ayuda/
Contacto: https://parzibyte.me/blog/contacto/
Copyright (c) 2020 Luis Cabrera Benito
Licenciado bajo la licencia MIT
El texto de arriba debe ser incluido en cualquier redistribución
* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXIMA_LONGITUD 100
void insertarSubcadena(char *original, char *subcadena, int indice) {
// El inicio es copiar la original N caracteres definidos por posición
char inicio[MAXIMA_LONGITUD] = "";
strncpy(inicio, original, indice);
// El final es copiar desde la posición N caracteres definidos por los sobrantes
char fin[MAXIMA_LONGITUD] = "";
strncpy(fin, original + indice, strlen(original) - indice);
// Agregar la subcadena al inicio
strcat(inicio, subcadena);
// Y agregar el fin a la anterior cadena, es decir, al inicio
strcat(inicio, fin);
// Copiarla dentro de la cadena recibida
strcpy(original, inicio);
}
int main() {
// Vamos a formar "Luis Cabrera"
char nombre[] = "us";
printf("Antes: %s\n", nombre);
// Insertamos la L al inicio
insertarSubcadena(nombre, "L", 0);
printf("Después: %s\n", nombre);
// La i en penúltimo lugar
insertarSubcadena(nombre, "i", 2);
printf("Después: %s\n", nombre);
// Ahora " Cabrera" al final
insertarSubcadena(nombre, " Cabrera", 4);
printf("Después: %s\n", nombre);
return EXIT_SUCCESS;
}
En mi caso todo funciona de maravilla: