Fazer uma função para:
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:
  1. O que é um ponteiro para char e como ele anda na memória;
  2. Como copiar caractere por caractere usando um laço (for ou while);
  3. 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 exemplo char *src) aponta pro primeiro caractere dessa string.
  • Pra acessar o i-ésimo caractere a partir de src, usamos sintaxe de vetor src[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:
  1. Iterar i de 0 até n-1.
  2. Se em algum momento src[i] == '\0', isso quer dizer que a string acabou; aí a gente copia '\0' pra dest[i] e sai do laço.
  3. Se não, copia src[i] pra dest[i].
Em fórmula, a cada passo:
dest[i] = src[i], i = 0,1,dots,n-1
mas interrompendo se src[i]='backslash0'.

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'.

Exercícios relacionados