Escreva suas próprias funções de cópia e concatenação de strings. Escreva duas versões de cada uma das funções de cópia e de concatenação de strings da Figura 8.17. A primeira versão deverá usar subscritos de array, e a segunda, ponteiros e aritmética de ponteiro.
Passo 1
Beleza meus bacanos?! Espero que sim, hoje iremos resolver mais uma atividade em C então é bom abrir se compilador para não se perder. Sem mais delongas, vamos começar!!
Vamos escrever as funções usando a assinatura de array primeiro. Vamos ver como strcpy e strncpy personalizados podem se parecer.

Basicamente inicializamos o contador (variável de controle) com 0 e passamos por todos os caracteres do segundo array (s2). Em seguida, atribuímos todos os valores de s2 a s1 e incrementamos a variável de controle. A única diferença entre essas duas funções é que passamos outro parâmetro na função strncpy1, e verificamos se o n dado é maior que nossa variável de contador na condição de loop. Finalmente, definimos o último caractere em s1 para o caractere final e retornamos s1.
Passo 2
Em seguida, podemos escrever nossas funções strcat e strncat personalizadas usando a assinatura do array.


Agora, vamos precisar de duas variáveis, i e j. Usaremos i para chegar ao caractere final de s1 (na verdade, é assim que obtemos i para o índice do último caractere, para que possamos concatenar os caracteres de s2 a s1). Em seguida, usamos j para indexar os caracteres de s2 que concatenamos para s1. A única diferença entre strcat1 e strncat1 é a condição extra que temos no segundo laço while. Finalmente, definimos o último caractere de s1 para ser o caractere final de uma string.
Passo 3
Agora, podemos escrever as funções strcpy2 e strncpy2 usando os ponteiros e a aritmética de ponteiros.

Precisaremos de outro ponteiro para s1 porque usaremos aritmética de ponteiro para s1, então acabaremos apontando para o último caractere com s1. É por isso que precisamos de outro ponteiro que aponte para o caractere inicial. Então, desreferenciamos s2 na condição do loop while. Durante o loop, continuamos atribuindo o valor desreferenciado para o qual s2 está apontando, para s1, enquanto incrementamos ambos os ponteiros no processo. Novamente, há apenas uma pequena diferença entre essas duas funções, pois continuamos fazendo a mesma coisa, com atenção ao tamanho da variável de controle em strncpy2. Finalmente, definimos o valor para o qual o ponteiro atual para s1 está apontando, para o caractere de terminação da string e retornamos o resultado que aponta para o início de s1.
Finalmente, usaremos a mesma aritmética de ponteiro para as funções strcat2 e strncat2.

Novamente, inicializaremos o ponteiro que aponta para s1 no início de ambas as funções (porque precisaremos retornar o ponteiro que aponta para o início do array char e não poderemos usar s1 porque 'vai incrementá-lo durante o loop). Em seguida, movemos o ponteiro s1 para o caractere final no primeiro loop while e continuamos desreferenciando s2 para que possamos concatenar seus caracteres até o final de s1. Fazemos a mesma coisa para strncat2, exceto que alteramos a condição do segundo loop while. Finalmente, definimos o último caractere de s1 para o caractere de terminação da string (é claro, usando o ponteiro para ele) e retornamos o resultado mencionado acima.
Você pode testar essas funções no programa principal escrevendo algo assim (claro, você precisará escrever os protótipos das funções primeiro):
int main()
{
char s1[15] = "string";
printf("%s\n", s1);
printf("%s\n", strcpy1(s1, "Test"));
printf("%s\n", strncpy1(s1, "Test", 3));
printf("%s\n", strcat1(s1, "Test"));
printf("%s\n", strncat1(s1, "ngram", 3));
return 0;
}
Resposta
Ver o desenvolvimento!!