Concatenando duas strings, fig 1.1.3

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:

5Hello
9Everybody
14HelloEverybody
Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.

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.

Last updated by at .