Obter Substring em C

Jinku Hu 12 outubro 2023
  1. Utilize a função strncpy para obter substring em C
  2. Utilizar função personalizada para obter o substring em C
Obter Substring em C

Este artigo irá introduzir múltiplos métodos sobre como obter substring em C.

Utilize a função strncpy para obter substring em C

strncpy faz parte da função de biblioteca de strings C definida no ficheiro de cabeçalho <string.h>. Copia o número dado de bytes da string de origem para o destino. O strncpy toma três parâmetros - destino char*, ponteiro da fonte, e o inteiro para denotar o número de bytes a copiar. Se o número de bytes especificado for superior ao que a string-fonte contém, então bytes nulos adicionais são armazenados no destino.

A função strncpy devolve o ponteiro à string de destino; assim, podemos encadear a chamada na declaração printf para imprimir directamente o substring. O exemplo seguinte demonstra como imprimir o primeiro substring de quatro caracteres e depois o seguinte substring 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);
}

Resultado:

This
string lit

Utilizar função personalizada para obter o substring em C

Em alternativa, podemos definir um invólucro de função personalizado para strncpy e especificar uma nova interface de quatro parâmetros. Nomeadamente, a função getSubstring tomará as strings de destino e fonte mais dois números inteiros especificando as posições inicial e final dos caracteres necessários como substring. Note-se que este protótipo de função não implementa verificação adicional de erros, mas devolve directamente o ponteiro char* passado da chamada strncpy.

Semelhante ao exemplo anterior, getSubstring também pode ser acorrentado à função printf como argumento. Uma advertência em relação ao strncpy é que as strings de destino e fonte não devem sobrepor-se na memória. Além disso, o ponteiro de destino deve apontar para um buffer suficientemente grande para armazenar a string-fonte.

#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);
}

Resultado:

This
string lit
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

Artigo relacionado - C String