Saltar al contenido
Portada » C/C++ » 5. Arrays y Cadenas de Caracteres C/C++

5. Arrays y Cadenas de Caracteres C/C++

Arrays y Cadenas de Caracteres C/C++. En este capítulo exploraremos el uso de arrays (arreglos) en el lenguaje C, una estructura fundamental para trabajar con colecciones de datos del mismo tipo. Aprenderás qué son los arrays, cómo se declaran, inicializan y acceden a sus elementos. Veremos tanto arrays unidimensionales como bidimensionales (matrices), y entenderás cómo se utilizan en funciones, cómo manipular sus elementos y cómo se recorren con bucles. Estos conocimientos te permitirán gestionar grandes cantidades de datos de forma ordenada y eficiente.

5.1 Arrays Unidimensionales y Multidimensionales en C

¿Qué es un Array?

Un array es una estructura de datos que permite almacenar múltiples valores del mismo tipo en posiciones contiguas de memoria. En lugar de declarar múltiples variables individuales, los arrays nos permiten usar una sola variable con índices para acceder a cada elemento.

Arrays Unidimensionales

Un array unidimensional es simplemente una lista de elementos del mismo tipo. Es como una fila de casillas numeradas, donde cada casilla puede almacenar un valor.

Sintaxis:

tipo nombre_array[tamaño];
  • tipo: el tipo de datos (por ejemplo: int, float, char).
  • nombre_array: el nombre del array.
  • tamaño: el número de elementos que puede almacenar.

Ejemplo: Veamos como declarar e inicializar un array

#include <stdio.h>

int main() {
int numeros[5] = {10, 20, 30, 40, 50};

for (int i = 0; i < 5; i++) {
printf("Elemento %d: %d\n", i, numeros[i]);
}

return 0;
}

Explicación:

  • Se declara un array numeros de 5 enteros.
  • Se inicializa con los valores 10, 20, 30, 40 y 50.
  • Se utiliza un bucle for para recorrerlo e imprimir cada valor.

Es importante tener en cuenta dos aspectos importantes a la hora de utilizar los arrays.

  • Los índices en C comienzan desde 0.
  • Si no se inicializa completamente un array, los elementos restantes toman el valor 0 por defecto (en variables globales o estáticas).

Arrays Multidimensionales

Un array multidimensional es un array de arrays. El más común es el array bidimensional, que puede considerarse como una tabla de filas y columnas o una matriz.

Sintaxis:

tipo nombre_array[filas][columnas];

Veamos un ejemplo de como inicializar una matriz

#include <stdio.h>

int main() {
int matriz[2][3] = {
{1, 2, 3},
{4, 5, 6}
};

for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("matriz[%d][%d] = %d\n", i, j, matriz[i][j]);
}
}

return 0;
}

Explicación:

  • matriz es un array de 2 filas y 3 columnas.
  • Se recorre con dos bucles anidados: uno para las filas y otro para las columnas.
  • Cada elemento se accede mediante dos índices: [fila][columna].

En cuanto a los arrays multidimensionales, hay que tener en cuenta que:

  • Se pueden declarar arrays de más dimensiones (Por ejemplo, espacios en 3D para 3 dimensiones), o 4, 5,…n dimensiones, pero son menos comunes y más complejos de manejar.
  • En arrays bidimensionales, todos los arrays internos (filas) deben tener el mismo número de columnas.

Inicialización Automática

C permite inicializar arrays parcialmente:

int datos[5] = {1, 2}; // datos[2] a datos[4] se inicializan en 0

También puedes usar un bucle para llenarlo dinámicamente:

for (int i = 0; i < 5; i++) {
datos[i] = i * 10;
}

Ventajas de usar arrays

  • Organización y estructura para múltiples datos del mismo tipo.
  • Permite trabajar fácilmente con los arrays utilizando bucles.
  • Facilita operaciones como búsqueda, ordenamiento y procesamiento en bloque.

Resumeniendo:

Tipo de arrayDescripciónEjemplo de uso
UnidimensionalLista de valores del mismo tipoint numeros[5];
BidimensionalMatriz de valores (filas y columnas)int matriz[3][4];

5.2 Recorrido de Arrays y Operaciones Comunes

Una vez que tenemos un array, una de las tareas más habituales es recorrerlo para consultar, modificar o procesar sus elementos. Esto se hace normalmente mediante estructuras repetitivas como el bucle for o while.

Recorrer un Array Unidimensional

El recorrido consiste en visitar cada posición del array utilizando su índice y realizar alguna acción con ese valor: imprimirlo, sumarlo, modificarlo, etc.

Veamos con un ejemplo como imprimir todos los elementos del array

#include <stdio.h>

int main() {
int edades[5] = {18, 25, 30, 22, 19};

for (int i = 0; i < 5; i++) {
printf("Edad en posicion %d: %d\n", i, edades[i]);
}

return 0;
}

Explicación:

  • Se usa un bucle for para iterar desde 0 hasta 4 (índice máximo).
  • En cada iteración se imprime el valor almacenado en esa posición del array.

Operaciones Comunes sobre Arrays Unidimensionales

A continuación, veremos con algunos ejemplos algunas operaciones habituales que se pueden aplicar a arrays.

Suma de los elementos del array

#include <stdio.h>

int main() {
int numeros[] = {10, 20, 30, 40, 50};
int suma = 0;

for (int i = 0; i < 5; i++) {
suma += numeros[i];
}

printf("Suma total: %d\n", suma);
return 0;
}

Resultado: Suma total: 150

Buscar un valor en el array

#include <stdio.h>

int main() {
int datos[] = {4, 8, 15, 16, 23, 42};
int objetivo = 23;
int encontrado = 0;

for (int i = 0; i < 6; i++) {
if (datos[i] == objetivo) {
printf("Valor %d encontrado en la posición %d\n", objetivo, i);
encontrado = 1;
break;
}
}

if (!encontrado) {
printf("Valor no encontrado\n");
}

return 0;
}

Explicación:

  • Se compara cada elemento con el valor buscado.
  • Si se encuentra, se imprime la posición y se rompe el bucle.

Encontrar el valor máximo

#include <stdio.h>

int main() {
int temperaturas[] = {21, 18, 25, 30, 27};
int max = temperaturas[0];

for (int i = 1; i < 5; i++) {
if (temperaturas[i] > max) {
max = temperaturas[i];
}
}

printf("Temperatura máxima: %d\n", max);
return 0;
}

Resultado: Temperatura máxima: 30

Recorrer Arrays Multidimensionales

Para recorrer arrays de más de una dimensión (por ejemplo, matrices), usamos bucles anidados. El mecanismo es el mismo, utilizar bucles para recorrer el array, pero en este caso necesitamos utilizar un bucle por cada una de las dimensiones que hemos definido del array.

Ejemplo: Recorrer una matriz e imprimir sus elementos

#include <stdio.h>

int main() {
int matriz[2][3] = {
{1, 2, 3},
{4, 5, 6}
};

for (int fila = 0; fila < 2; fila++) {
for (int col = 0; col < 3; col++) {
printf("matriz[%d][%d] = %d\n", fila, col, matriz[fila][col]);
}
}

return 0;
}

Otras operaciones comunes en matrices que podríamos hacer:

  • Suma total de todos los elementos.
  • Suma de una fila o columna específica.
  • Búsqueda de un valor dentro de la matriz.

Ejemplo: Sumar todos los valores de una matriz

#include <stdio.h>

int main() {
int matriz[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
int suma = 0;

for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
suma += matriz[i][j];
}
}

printf("Suma total de la matriz: %d\n", suma);
return 0;
}

Consejos prácticos

  • Importante: Siempre controla que no accedes fuera de los límites del array (esto nos daría un error de overflow de índices).
  • Cuando se trabaja con arrays en funciones, recuerda que se pasan por referencia (se modifica directamente el array original).

5.3 Cadenas de caracteres en C

¿Qué es una cadena de caracteres?

En C, una cadena de caracteres (o simplemente string) es una secuencia de caracteres terminada por un carácter nulo ('\0'). Aunque en muchos lenguajes modernos los strings son objetos complejos, en C se representan como arrays de tipo char.

char saludo[] = "Hola";

Este array contiene en realidad los siguientes caracteres:

['H', 'o', 'l', 'a', '\0']

El carácter '\0' (cero nulo) es obligatorio para indicar el final de la cadena.

Declaración y asignación de cadenas

Hay dos formas principales de declarar una cadena:

A. Usando una cadena literal:

char saludo[] = "Hola";

Aquí el compilador asigna automáticamente espacio para los caracteres más el carácter '\0'.

B. Definiendo manualmente el tamaño:

char nombre[10] = "Ana";

El tamaño del array puede ser mayor al necesario, pero recuerda que el espacio debe incluir '\0'.

Entrada y salida de cadenas

Imprimir cadenas con printf

Para imprimir una cadena de caracteres utilizamos la función printf() donde facilitamos como parámetro el texto, modificadores y las variables a imprimir.

char saludo[] = "Buenos días";
printf("%s\n", saludo);
  • %s es el modificador que se utiliza para imprimir cadenas.

Leer cadenas con scanf

char nombre[20];
scanf("%s", nombre);

¡Cuidado! scanf("%s", ...) detiene la lectura al encontrar un espacio. Si el usuario introduce «Juan Pérez», solo se almacenará «Juan».

Para leer cadenas completas con espacios, se usa fgets():

fgets(nombre, 20, stdin);

Esto lee hasta 19 caracteres o hasta que se presione Enter, incluyendo espacios.

Funciones útiles de la biblioteca <string.h>

C provee una serie de funciones para trabajar con cadenas de caracteres a través de la biblioteca estándar string.h.

strlen() – Longitud de una cadena

Esta función nos devuelve un entero con el tamaño de la cadena de caracteres.

#include <string.h>

char palabra[] = "Lenguaje";
int longitud = strlen(palabra); // longitud = 8

strcpy() – Copiar una cadena

Podemos copiar un cadena de caracteres en otro array de la siguiente manera:

#include <string.h>

char origen[] = "Hola";
char destino[10];

strcpy(destino, origen); // destino ahora contiene "Hola"

¡Importante! Asegúrate de que destino tenga suficiente espacio.

strcmp() – Comparar cadenas.

Podemos comparar dos cadenas y ver si contienen el mismo texto con la función strcmp()

#include <string.h>

char a[] = "Hola";
char b[] = "hola";

if (strcmp(a, b) == 0) {
printf("Las cadenas son iguales\n");
} else {
printf("Las cadenas son diferentes\n");
}
  • strcmp devuelve:
    • 0 si las cadenas son iguales
    • < 0 si a es menor que b
    • > 0 si a es mayor que b (según el orden ASCII)

Nota: Es sensible a mayúsculas/minúsculas. Puedes usar strcasecmp() (no estándar) si quieres ignorar ese factor.

strcat() – Concatenar cadenas

Se utiliza para juntar dos cadenas.

#include <string.h>

char saludo[20] = "Hola, ";
char nombre[] = "Carlos";

strcat(saludo, nombre); // saludo ahora contiene "Hola, Carlos"

Precaución: Asegúrate de que saludo tenga suficiente espacio para almacenar la cadena final.

Recorrer una cadena con un bucle

Al igual que hicimos en el segundo apartado, para recorrer una cadena de caracteres utilizamos los bucles. También podemos acceder a un carácter concreto del array de caracteres indicando su índice diréctamente.

char texto[] = "Cadenas";
for (int i = 0; texto[i] != '\0'; i++) {
printf("Caracter %d: %c\n", i, texto[i]);
}

Se utiliza texto[i] != '\0' como condición de parada.

Recomendaciones al usar cadenas en C

  • Siempre reserva espacio para el carácter '\0'.
  • Usa fgets en vez de scanf si esperas que el usuario escriba frases con espacios.
  • Evita escribir más allá del límite del array (desbordamiento).
  • Existen otras funciones para manipulación segura como pueden ser: strncpy, strncat, etc.

Veamos un ejemplo completo de utilización de arrays de caracteres.

#include <stdio.h>
#include <string.h>

int main() {
char nombre[50];

printf("Introduce tu nombre: ");
fgets(nombre, sizeof(nombre), stdin);

// Eliminar salto de línea si existe
nombre[strcspn(nombre, "\n")] = '\0';

printf("Hola, %s. Tu nombre tiene %lu letras.\n", nombre, strlen(nombre));

return 0;
}

Este programa:

  • Lee un nombre con fgets
  • Elimina el salto de línea (\n) que incluye fgets
  • Muestra el nombre y su longitud

Tabla de funciones comunes de <string.h>

A continuación te muestro una guía de las funciones más utilizadas en string.h

FunciónDescripciónEjemplo de uso
strlen(s)Devuelve la longitud de la cadena s (sin contar '\0').int len = strlen("Hola"); // len = 4
strcpy(dest, src)Copia la cadena src en dest (incluye el '\0').strcpy(destino, origen);
strncpy(dest, src, n)Copia como máximo n caracteres de src a dest.strncpy(dest, src, 5);
strcat(dest, src)Añade src al final de dest (concatena).strcat(s1, s2);
strncat(dest, src, n)Añade como máximo n caracteres de src a dest.strncat(s1, s2, 3);
strcmp(s1, s2)Compara s1 y s2; devuelve 0 si son iguales, negativo o positivo si no.if(strcmp(a, b) == 0)
strncmp(s1, s2, n)Compara hasta n caracteres de s1 y s2.strncmp(a, b, 3);
strchr(s, c)Devuelve un puntero a la primera aparición del carácter c en s.char *p = strchr("Hola", 'l');
strrchr(s, c)Devuelve un puntero a la última aparición del carácter c en s.char *p = strrchr("Hola", 'l');
strstr(haystack, needle)Devuelve un puntero al primer substring needle dentro de haystack.char *p = strstr("Hola mundo", "mun");
strspn(s1, s2)Devuelve el número de caracteres iniciales en s1 que están en s2.strspn("abc123", "abc") → 3
strcspn(s1, s2)Devuelve el número de caracteres en s1 antes de encontrar cualquiera en s2.strcspn("abc123", "123") → 3
strtok(s, delimitadores)Divide la cadena s en tokens según los delimitadores.strtok(cadena, " ");
memset(ptr, c, n)Llena los primeros n bytes del área de memoria apuntada por ptr con c.memset(buffer, 0, sizeof(buffer));
memcpy(dest, src, n)Copia n bytes desde src hacia dest.memcpy(dest, src, n);
memmove(dest, src, n)Igual que memcpy pero soporta solapamiento de memoria.memmove(dest, src, n);
memcmp(s1, s2, n)Compara los primeros n bytes de s1 y s2.memcmp(a, b, 5);
Logo C++

Bibliografía del tutorial de C/C++.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *