miguelt1 Posted December 30, 2015 at 06:44 PM Report Share #591146 Posted December 30, 2015 at 06:44 PM 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 More sharing options...
Solution HappyHippyHippo Posted December 30, 2015 at 08:18 PM Solution Report Share #591149 Posted December 30, 2015 at 08:18 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now