HOWTO · C

Obtener la longitud del array de caracteres en C

Este artículo demuestra cómo obtener la longitud de un array de caracteres en C

En esta página

En C, «longitud» puede referirse al número de elementos reservados en un array de char o al número de caracteres anteriores al terminador nulo de una cadena. Usa sizeof para obtener el espacio ocupado y el número de elementos de un array mientras su tipo siga disponible. Usa strlen solo con una cadena válida terminada en nulo.

Cómo obtener la longitud de un array de char en C con el operador sizeof

sizeof array devuelve el tamaño del array en bytes de C. Divídelo por sizeof array[0] para obtener el número de elementos. En un array de char, cada elemento ocupa un byte de C; un byte de C no necesariamente equivale a un octeto de ocho bits.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

#include <stdio.h>

int main(void) {
  char letters[] = {'C', 'o', 'd', 'e'};
  char word[] = "Code";
  size_t letters_count = sizeof letters / sizeof letters[0];
  size_t word_capacity = sizeof word / sizeof word[0];
  size_t word_length = word_capacity - 1;

  printf("letters: %zu elements, %zu bytes\n", letters_count, sizeof letters);
  printf("word: %zu characters, %zu elements including '\\0'\n",
         word_length, word_capacity);
  return 0;
}
letters: 4 elements, 4 bytes
word: 4 characters, 5 elements including '\0'

El inicializador de letters reserva cuatro elementos y no incluye un terminador. El literal de cadena inicializa word con cinco elementos: cuatro caracteres visibles y el \0 final. Resta uno solo si sabes que el array contiene ese terminador y buscas la longitud de la cadena. %zu es el especificador de conversión de printf correspondiente a size_t.

sizeof mide el array completo solo cuando su tipo está disponible. En un parámetro de función como char text[], el parámetro se ajusta a un puntero; entonces, sizeof text mide el puntero. Si una función necesita la longitud del array, pásale también el número de elementos. Consulta size_t para conocer el tipo sin signo que se usa para los tamaños.

Cómo obtener la longitud de un array de char en C con la función strlen

strlen, declarada en <string.h>, cuenta los caracteres hasta el primer \0, sin incluirlo. Su argumento debe apuntar a una cadena válida terminada en nulo. La función no conoce la capacidad del array ni puede encontrar de forma segura el final de uno que carezca de terminador. Consulta cadenas terminadas en nulo para ver cómo funciona esta representación.

Por ejemplo, strlen("Code") devuelve cuatro: el literal tiene cinco elementos en el array, pero el terminador no se cuenta. Esta llamada es válida porque el literal incluye el terminador. No llames a strlen con un array de tamaño explícito a menos que sepas que hay un terminador dentro de los límites accesibles del array.

Cómo obtener la longitud de un array de char en C contando manualmente

El recuento manual resulta útil cuando conoces un límite o hay un terminador válido. Para un array cuyo número de elementos conoces como count, recorre los índices desde 0 hasta count - 1; no leas array[count]. Si quieres obtener la longitud de una cadena almacenada en ese array, detente en \0 y asegúrate de que el recorrido no supere el límite del array.

Este ejemplo usa el número de elementos del array como límite y también se detiene en su terminador. Como text se inicializa a partir de un literal de cadena, el terminador está dentro del array. El bucle comprueba el límite antes de leer cada elemento, por lo que nunca accede a text[sizeof text]. El ejemplo imprime 4, correspondiente a los cuatro caracteres de Code.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

#include <stdio.h>

int main(void) {
  char text[] = "Code";
  size_t length = 0;
  size_t capacity = sizeof text / sizeof text[0];

  while (length < capacity && text[length] != '\0') {
    ++length;
  }

  printf("%zu\n", length);
  return 0;
}

Para datos sin terminador, usa el número de elementos proporcionado por separado y procesa solo esos elementos. No recorras los datos hasta \0 a menos que haya garantía de que el terminador está dentro del límite.

Cómo obtener la longitud de un array de char en C con punteros

Un puntero puede recorrer una cadena, pero no contiene la capacidad del array. En una cadena válida terminada en nulo, el recorrido puede avanzar mientras *ptr != '\0'; esto requiere el mismo terminador que strlen. En este ejemplo se toma la dirección de un array creado a partir de un literal de cadena, así que se garantiza que hay un terminador dentro del límite conocido. Se comprueba el puntero al final antes de desreferenciarlo y también se detiene el recorrido en el terminador. El ejemplo imprime 4, correspondiente a los cuatro caracteres de Code.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

#include <stdio.h>

int main(void) {
  char text[] = "Code";
  char *ptr = text;
  char *end = text + sizeof text / sizeof text[0];

  while (ptr < end && *ptr != '\0') {
    ++ptr;
  }

  printf("%zu\n", (size_t)(ptr - text));
  return 0;
}

Para datos sin terminador, conserva un contador o un puntero al final por separado y detente en ese límite conocido. Si una función recibe un puntero al primer elemento, pásale también el número de elementos cuando deba recorrer un array cuya longitud no esté indicada por un terminador de cadena. La aritmética de punteros por sí sola no permite determinar dónde termina un array. Consulta longitud de un array en C para conocer la distinción relacionada con el tamaño de los arrays.

Conclusión

Elige la medida que corresponda a la tarea: sizeof array / sizeof array[0] da el número de elementos del array cuando su tipo completo está disponible; resta el terminador únicamente si sabes que el array lo contiene y buscas la longitud de la cadena. strlen cuenta los caracteres anteriores a \0 en una cadena válida terminada en nulo. El recorrido manual o con punteros requiere un terminador válido o un límite explícito. Conserva la longitud del array al pasarlo a una función, porque esos parámetros son punteros.