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
char
e como ele anda na memória; - Como copiar caractere por caractere usando um laço (
for
ouwhile
); - 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
char
finalizado 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
i
de0
até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'
.