Fazer uma função para:
Receber dois ponteiros para char (char*) como parâmetro e um número representando uma certa quantidade de caracteres.
Receber dois ponteiros para char (char*) como parâmetro e um número representando uma certa quantidade de caracteres.
Passo 1
O enunciado pede pra gente criar uma função em C que recebe dois ponteiros para
char (vamos chamar de dest e src) e um inteiro n que indica quantos caracteres a gente deve “mexer”. O assunto aqui é manipulação de strings com ponteiros em C. Pra resolver, vamos precisar entender:- O que é um ponteiro para
chare como ele anda na memória; - Como copiar caractere por caractere usando um laço (
forouwhile); - Como lidar com o terminador nulo
'\0'.
Passo 2
Antes de programar, bora revisar a teoria de ponteiros e strings em C:
- Uma string em C é um vetor de
charfinalizado em'\0'. - Um ponteiro para
char(por exemplochar *src) aponta pro primeiro caractere dessa string. - Pra acessar o i-ésimo caractere a partir de
src, usamos sintaxe de vetorsrc[i]ou aritmética de ponteiro*(src + i).
O nosso objetivo é copiar até
n caracteres de src para dest. Algo parecido com a função padrão strncpy.Passo 3
Agora, o pseudocódigo básico:
- Iterar
ide0atén-1. - Se em algum momento
src[i] == '\0', isso quer dizer que a string acabou; aí a gente copia'\0'pradest[i]e sai do laço. - Se não, copia
src[i]pradest[i].
Em fórmula, a cada passo:
mas interrompendo se
Passo 4
Tem um detalhe: se a gente parar porque encontrou
'\0' antes de chegar em n, então tecnicamente os bytes em dest além desse ponto ficam “sujos”. Pra ficar parecido com strncpy, podemos preencher até n com '\0'. Assim garantimos que dest sempre termina em nulo e não carrega lixo.Passo 5
A implementação em C, informalmente, fica assim:
char *minha_strncpy(char *dest, const char *src, size_t n) {
size_t i;
for (i = 0; i < n; i++) {
if (src[i] == '\0') {
// Se acabou no src, coloca '\0' e segue zerando até n
break;
}
dest[i] = src[i];
}
// Preenche o resto com '\0', se tiver sobrado
for (; i < n; i++) {
dest[i] = '\0';
}
return dest;
}
Resposta
A função acima (
minha_strncpy) recebe dest, src e n, copia até n caracteres de src para dest, e garante que dest esteja terminado em '\0'.