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?