HOWTO · C

Obtener subcadena en C

Este artículo presenta cómo obtener la subcadena en C

En esta página

Este artículo presenta varios métodos para obtener una subcadena en C.

Usa la función strncpy para obtener la subcadena en C

strncpy es parte de la función de la biblioteca de cadenas de C definida en el archivo de cabecera <string.h>. Copia el número dado de bytes de la cadena de origen al destino. strncpy toma tres parámetros - el char* de destino, el puntero de origen, y el número entero para denotar el número de bytes a copiar. Si el número de bytes especificado es mayor que el que contiene la cadena de origen, se almacenan bytes nulos adicionales en el destino.

La función strncpy devuelve el puntero a la cadena de destino; así, podemos encadenar la llamada a la sentencia printf para imprimir directamente la subcadena. El siguiente ejemplo demuestra cómo imprimir la primera subcadena de cuatro caracteres y luego la siguiente subcadena de 10 caracteres.

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

const char *tmp = "This string literal is arbitrary";

int main(int argc, char *argv[]) {
  char *str = malloc(strlen(tmp));

  printf("%s\n", strncpy(str, tmp, 4));
  printf("%s\n", strncpy(str, tmp + 5, 10));

  free(str) exit(EXIT_SUCCESS);
}

Producción :

This
string lit

Usar una función personalizada para obtener una subcadena en C

Alternativamente, podemos definir una función personalizada para strncpy y especificar una nueva interfaz de cuatro parámetros. En concreto, la función getSubstring tomará las cadenas destino y origen más dos enteros que especifican las posiciones inicial y final de los caracteres necesarios como subcadena. Tenga en cuenta que este prototipo de función no implementa una comprobación de errores adicional, sino que devuelve directamente el puntero char* pasado desde la llamada strncpy.

Al igual que en el ejemplo anterior, getSubstring también puede encadenarse a la función printf como argumento. Una advertencia con respecto a strncpy es que las cadenas de destino y origen no deben superponerse en la memoria. Además, el puntero de destino debe apuntar a un buffer lo suficientemente grande como para almacenar la cadena de origen.

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

const char *tmp = "This string literal is arbitrary";

char *getSubstring(char *dst, const char *src, size_t start, size_t end) {
  return strncpy(dst, src + start, end);
}

int main(int argc, char *argv[]) {
  char *str = malloc(strlen(tmp));

  printf("%s\n", getSubstring(str, tmp, 0, 4));
  printf("%s\n", getSubstring(str, tmp, 5, 10));

  free(str);
  exit(EXIT_SUCCESS);
}

Producción :

This
string lit