Matriz de cadenas en C

Jinku Hu 12 octubre 2023
  1. Usa la notación 2D para declarar un array de cadenas en C
  2. Utilizar la notación de array char* para declarar arrays de cadenas en C
Matriz de cadenas en C

Este artículo demostrará múltiples métodos sobre cómo declarar un array de cadenas en C.

Usa la notación 2D para declarar un array de cadenas en C

Las cadenas en C son simplemente una secuencia de cadenas almacenadas en una región de memoria contigua. Una distinción sobre las cadenas de caracteres es que hay un byte nulo de terminación \0 almacenado al final de la secuencia, denotando el final de una cadena. Si declaramos un array fija de char utilizando la notación [], entonces podemos almacenar una cadena que consista en el mismo número de caracteres en esa ubicación.

Hay que tener en cuenta que al copiar la cadena de caracteres en la ubicación del array hay que tener en cuenta un espacio extra para el byte nulo de terminación. Por lo tanto, se puede declarar un array bidimensional char con notación de paréntesis y utilizarlo como array de cadenas. La segunda dimensión del array limitará la longitud máxima de la cadena. En este caso, definimos arbitrariamente una macro constante - MAX_LENGTH igual a 100 caracteres. Toda el array puede ser inicializada con la notación {""}, que pone a cero cada elemento char del array. Cuando se almacenan los valores de las cadenas en el array ya inicializada, no se permite el operador de asignación, y se deben emplear funciones especiales de copia de memoria como strcpy.

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

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char arr[NUM_STRINGS][MAX_LENGTH] = {""};

  arr2[0] = "string literal";  // Not permitted
  strcpy(arr[0], "hello world");
  printf("%s\n", arr[0]);
  printf("%s\n", strcpy(arr[0], "hello world"));

  exit(EXIT_SUCCESS);
}

Producción :

hello world
hello world

Alternativamente, podemos inicializar el array bidimensional char instantáneamente cuando se declara. El moderno estándar C11 permite inicializar los Arrays char con literales de cadena e incluso almacenar el byte nulo al final de la cadena automáticamente cuando la longitud del array es mayor que la propia cadena. La notación de la lista inicializadora es similar a la sintaxis de C++. Se supone que cada elemento con corchetes se almacena en una región de memoria consecutiva de longitud MAX_LENGTH. En caso de que la notación del inicializador especifique menos elementos que el tamaño del array, los elementos restantes se inicializan implícitamente con \0 bytes.

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

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char arr2[NUM_STRINGS][MAX_LENGTH] = {{"first string"},
                                        {"second string"},
                                        {"third string"},
                                        {"fourth string"},
                                        {"fifth string"}};

  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr2[i]);
  }

  exit(EXIT_SUCCESS);
}

Producción :

first string, second string, third string, fourth string, fifth string, , , , , ,

Utilizar la notación de array char* para declarar arrays de cadenas en C

char* es el tipo que se utiliza generalmente para almacenar cadenas de caracteres. Declarar el array de char* nos da el número fijo de punteros que apuntan al mismo número de cadenas de caracteres. Puede ser inicializado con literales de cadena como se muestra en el siguiente ejemplo, asignado o copiado usando funciones especiales proporcionadas en la cabecera string.h.

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

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main() {
  char* arr3[NUM_STRINGS] = {"first string", "second string", "third string",
                             "fourth string", "fifth string"};
  char* str1 = "string literal";
  arr3[8] = str1;
  arr3[9] = "hello there";

  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr3[i]);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

Producción :

first string, second string, third string, fourth string, fifth string, (null), (null), (null), string literal, hello there,

Como alternativa, se pueden especificar sólo las llaves {}, lo que inicializará los punteros del array a null, y podrán ser utilizados posteriormente para almacenar otras direcciones de cadenas, o incluso el programador puede asignar memoria dinámica.

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

#define NUM_STRINGS 10

int main() {
  char *arr4[NUM_STRINGS] = {};
  for (int i = 0; i < NUM_STRINGS; ++i) {
    printf("%s, ", arr4[i]);
  }
  printf("\n");

  exit(EXIT_SUCCESS);
}

Producción :

(null), (null), (null), (null), (null), (null), (null), (null), (null), (null),
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C Array

Artículo relacionado - C String