Antes de começar:
Esse aqui é a implementação do primeiro exemplo do livro: TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGESNSTEIN, Moshe J.. Estruturas de Dados Usando C. São Paulo: Pearson, 2013. 884 p. ISBN 13: 978-85-346-0348-5, figura 1.1.3, pg 16.
A ideia dessa série aqui é, sem compromisso de um dia terminar, ir implementando uma série de algoritmos propostos em diversos livros e sites e os ir comentando.
Não é minha intenção esgotar o assunto, estou fazendo como se fosse um quebra cabeças, sugestões de melhoria são bem vindas, e sempre que possível vou tentar me manter fiel à proposta do algoritmo, lembrando que apontar imprecisões sempre serão bem vindas e se eu faltar em citar alguma fonte, me avisem que terei o prazer em fazer a devida justiça.
Essas implementações estão publicamente disponíveis no meu diretório do GitHub, fiquem à vontade para as estudar e usar em aula. Só peço a gentileza de que sejam dados os devidos créditos.
Se você curtir esse artigo, não esqueça de dar uns cliques nos anúncios para ver o que os anunciantes tem para te oferecer. Vou ficar muito contente.
Indo ao que interessa:
O algoritmo do livro aborda um método de se concatenar 2 strings em uma terceira string, sendo que:
- A primeira posição de cada string contém o valor do tamanho da string
- São utilizados tamanhos pré definidos
- Ao final, o programa lista a primeira, a segunda string bem como o resultado final da string “concatenada”.
Segue a implementação:
/*
Implementando os algoritmos do livro "Estruturas de Dados Usando C - Tenembaum"
Autor da implementação: Renato de Pierri
Concatenando duas strings - figura 1.1.3
*/
#include <stdio.h>
#include <stdlib.h>
void movimenta(char origem[],char destino[],int *posicao_destino);
int main()
{
int posicao=0;
int indice=1;
char palavra_1[]="5Hello";
char palavra_2[]="9Everybody";
char concatenado[16];
movimenta (palavra_1,concatenado,&posicao);
posicao++;
movimenta (palavra_2,concatenado,&posicao);
concatenado[0]=posicao;
printf("%s\n%s\n%d",palavra_1,palavra_2,concatenado[0]);
while (concatenado[indice]!='\0'){
printf ("%c",concatenado[indice]);
indice++;
}
return 0;
}
void movimenta(char origem[],char destino[],int *posicao_destino){
int indice_origem = 0;
if ((*posicao_destino)>=1){indice_origem++;}
while (origem[indice_origem] != '\0'){
destino[(*posicao_destino)] = origem[indice_origem];
(*posicao_destino)++;
indice_origem++;
}
(*posicao_destino)--;
}
Pontos interessantes:
O algoritmo pede para concatenar na string “concatenado”, os valores “5Hello” com o valor “9Everybody”.
A string “concatenado” deve ter o tamanho de 16 posições, sendo que a a posição zero contém o tamanho da string, as 14 posições seguintes vão conter o valor concatenado e a posição 15 irá ter o caractere ‘\0’ (NULL) que é o indicador de fim de string.
Considerando que só o primeiro caractere da string deve ter a informação do tamanho da string, o número “9” não pode aparecer no meio da string e a posição “0” da string “concatenado” tem que ter o número total de caracteres válidos, que é “14” nesse caso.
Na execução do programa, temos a função “movimenta(origem, destino, posicao inicial)” que serve para fazer a concatenação.
Na primeira vez que a função “movimenta” é chamada, ela envia a string palavra_1 – “5Hello”, a string “concatenado” que vai receber os valores e o endereço do ponteiro “posicao” indicando que a string “concatenado” deve receber os caracteres a partir da posição “0”
Considerando que a a string “5Hello” que já está dentro de “concatenado”, para “concatenado” começar a receber a “palavra_2”, o valor de “posicao” deve ser incrementado em um, para que “Everybody” não comece a ser escrito em cima do último caractere da string “5Hello”.
- Errado: “5HellEverydody”
- Correto: “5HelloEverybody”
Uma vez incrementado o valor de “posicao”, chama-se novamente a função “movimenta”, agora passando a “palavra_2”, a string “concatenado” e o valor de “posicao” que por sua vez, concatena a string “Everybody”, pulando o primeiro caractere, responsável por indicar o tamanho de “palavra_2”. e terminando a concatenação.
Função movimenta:
A função movimenta recebe a string “origem[]”, a string “destino[]” e o endereço da variável “posicao”, para que ela possa ser manipulada fora de escopo pelo índice “*posicao_destino”.
Essa função simplesmente vai copiando um a um, os caracteres da string “origem” para a string “destino”.
As linhas 33, 36, 37 e 39 servem para ajustar as variáveis “indice_origem” e “*posicao_destino”, conforme o necessário.
Imprimindo:
Na impressão o comando “printf” da linha 22 imprime:
- Na primeira linha o conteúdo de “palavra_1”,
- Na segunda linha o conteúdo de “palavra_2”,
- Na terceira linha é impresso como número, o conteúdo o primeiro caractere da string “concatenado”.
Ainda na terceira linha, o “printf” da linha 24 é chamado dentro do bloco “while”, agora para imprimir como caracteres, os demais elementos da string “concatenado”.
Abaixo tem um print de tela do programa:
GitHub
https://github.com/renatopierri/algoritmos/tree/main/concatena_string
Bibliografia
TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGESNSTEIN, Moshe J.. Estruturas de Dados Usando C. São Paulo: Pearson, 2013. 884 p. ISBN 13: 978-85-346-0348-5
Curtiu?
Vou ficar muito contente se você clicar nos anúncios do meu site e dar uma olhadinha no que os anunciantes tem de bom para te mostrar.