Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Duvida, juntando duas structs em uma só

Fiz essa questão, uma string que é a junção de outras duas, o problema é que ele sai do looping porém a struct final "resultado" está pegando lixo. Fiz a seguinte observação: - se no segundo sprintf eu colocar mais um caracter ela da certo - enquanto escrevia isso testei colocar um /0 após sair do looping e funcionou, porém gostaria de ajuda para entender por que isso aconteceu.

#include <stdio.h>
#include <stdlib.h>
void concatena(char string[], char string2[]){
    int i=0, tamanhoresultado, i2=0;
    char resultado[100];
    tamanhoresultado = strlen(string) + strlen(string2);
    for(i=0;i<tamanhoresultado;i++){
        if(i<strlen(string))
                resultado[i]=string[i];
        else{
                resultado[i]=string2[i2];
                i2++;
                }
    }
    printf("%s\n", resultado);

}
int main()
{
    char string[30], string2[30];
    sprintf(string,"test");
    fflush(stdin);
    sprintf(string2,"ts");
        fflush(stdin);
             concatena(string, string2);

    return 0;
}
3 respostas

Oi Rodrigo.

O que acontece é que o C entende o caractere \0 um "sinal" de que a string acabou. Quando você faz uma instrução do tipo:

printf("%s", resultado);

Ele entende que deve imprimir a partir do que está na primeira posição da variável resultado e parar quando encontrar um \0. Se você não coloca o \0 ele continua imprimindo o que está nas posicões seguintes da memória (por isso imprime um monte de lixo).

Era isso que você estava perguntando? Espero ter ajudado.

Mas ele não deveria colocar o /0 automaticamente?

solução!

Ele coloca apenas se você usa funções feitas para manipulação de strings, por exemplo, quando você lê uma string com %s ele entende que aquilo é uma string e portanto deve adicionar o \0 após a leitura.

Mas no seu caso, você está manipulando duas strings manualmente, além disso o \0 não conta como um caractere da string, entao se sua palavra é 'amora' o tamanho retornado pela função strlen é 5 e não 6 (se contasse o \0). Por isso ele não chega a ser copiado em

resultado[i]=string[i];

Por isso, toda vez que você estiver manipulando strings manualmente sem auxílio de funções feitas para lidar com elas você deve se preocupar com \0. Faz sentido?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software