Jump to content

Explicação de função (comparar palavras)


miguelt1
 Share

Go to solution Solved by HappyHippyHippo,

Recommended Posts

Boas! Eu tenho umas duvidas relativamente ao codigo da aula 59 do canal De Aluno para Aluno.

A minha primeira duvida e relativamente a esta funcao:

bool compararpalavras(const char str1[],const char str2[]) {
  int i=0;
  while(str1[i]==str2[i] && str1[i]!='\0' && str2[i]!='\0') {
    i++;
  }
  if(str1[i]=='\0' && str2[i]=='\0') {
    return true;
  } else {
    return false;
  }
}
Não percebi a razão de se utilizar str1[ i ]!='\0' && str2[ i ]!='\0' porque no meu entender essa função funcionava sem esse bocado (o que está errado porque já testei). Por exemplo, utilizo as palavras casa e casa nessa função, o que faria era o i inicialmente ser 0 por isso vai verificar a letra c e se forem iguais passa para a próxima e assim sucessivamente, assim não entendo a razão daquele bocado porque o computador sabe que o \0 está no último caracter. Sei que fui um bocado confuso por isso podem me explicar ao pormenor a função toda?

P.S- o código funciona perfeitamente como está, apenas quero compreender o que ali está.

Deixo ainda o link com o vídeo, se assim o entenderem melhor:

https://www.youtube.com/embed/videoseries?list=PLa75BYTPDNKZWYypgOFEsX3H2Mg-SzuLW

Link to comment
Share on other sites

  • Solution

isso está por duas razões:

- nunca deves ler memória que não foi alocada, logo leituras após o '\0' final é extremamente desaconselhado

- caso essas comparações não estiverem ai, a comparação de duas palavras iguais não faz parar o ciclo quando chega ao fim desta

por outras palavras, o while inicial só para quando é feita uma comparação de bytes diferentes, que existiram fora do limite das palavras.

exemplo:

int main(void)
{
 char palavra1[6] = {'c', 'a', 's', 'a', '\0', 'x'}; // nota no caracter adicional para exemplificar "lixo" em memória após a palavra
 char palavra2[6] = {'c', 'a', 's', 'a', '\0', 'y'}; // nota no caracter adicional para exemplificar "lixo" em memória após a palavra

 printf("palavra 1 : %s\n", palavra1);               // output : "casa"
 printf("palavra 2 : %s\n", palavra2);               // output : "casa"

 int i = 0;
 while (palavra1[i] == palavra2[i])                  // este ciclo só vai parar quando comparar 'x' com 'y'
   i++;

 printf("i = %d\n", i);                              // output : 5 <- posição do 'x' e do 'y'

 if (palavra1[i] == '\0' && palavra2[i] == '\0')     // esta condição irá falhar porque o ciclo não parou em '\0'
   printf("as palavras sao iguais\n");
 else
   printf("as palavras sao diferentes\n");           // <--- esta é a frase a ser apresentada no output

 return 0;
}

conclusão : o teste que fizeste ao remover as comparações que dizes "não fazer nada", esta errado porque irá falhar sempre a comparação de palavras iguais

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.