Jump to content
SuissoS

Verificar se duas strings são iguais

Recommended Posts

SuissoS

Eu estou a praticar exercicios para o meu teste de arquitectura de computadores esta semana e estou a fazer um exercicio em que pede para eu verificar se duas strings inseridas pelo utilizadores são iguais. Este é o codigo que fiz, mas qualquer que sejam as frases, diz que não são iguais. já estou à quase uma hora à procura do erro e não encontro. podem-me ajudar ?

#include <stdio.h>

int tamanhofrase(char s[]) {
  int i=0;
  while(s[i]!='\0') {
i++;
  }
  return i;
}

int main() {
  char str1[30],str2[30];
  int i,j,a=0,c=0;
  printf("Digite uma frase:");
  fgets(str1,30,stdin);
  printf("Digite uma frase:");
  fgets(str2,30,stdin);
  i=tamanhofrase(str1);
  j=tamanhofrase(str2);
  if(i==j) {
while (a!=i || c==0) {
if (str1[a]==str2[a]) {
 c=0;
} else {
 c=1;
}
a++;
}
if(c==0) {
printf("As frases são iguais\n");
} else {
printf("As frases não são iguais\n");
}
  } else {
printf("As frases não são iguais\n");
  }
  return 0;
}

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
KiNgPiTo

Repara que no invariante do teu ciclo tens um OR, isto é, o ciclo executará enquanto pelo menos uma das condições for verdadeira. Se encontrares um caracter diferente, o c passa a 1 mas a outra condição mantém-se verdadeira e o ciclo continua.

Passa esse || para && e deverá funcionar...

EDIT: Repara que sempre que os caracteres são iguais, estás a definir o c para 0, mas não é necessário fazeres isso quando a condição é verdadeira mas sim quando é falsa (são diferentes).

Edited by KiNgPiTo

Share this post


Link to post
Share on other sites
HappyHippyHippo

só em termos de conhecimento, ficas a saber que isso se resolve num par de linhas :

#include <stdio.h>
#include <string.h>

int main() {
 char str1[30], str2[30];

 printf("Digite uma frase:");
 fflush(stdout); // se não tens o '\n' no printf, deverás usar o fflush de seguinda para prevenir coisas estranhas
 fgets(str1, 30, stdin);

 printf("Digite uma frase:");
 fflush(stdout); // se não tens o '\n' no printf, deverás usar o fflush de seguinda para prevenir coisas estranhas
 fgets(str1, 30, stdin);

 if(strcmp(str1, str2) == 0)
   printf("As frases são iguais\n");
 else
   printf("As frases não são iguais\n");

 return 0;
} 

claro que duvido que tenha sido a intenção do professor de resolver o problema desta forma ...

-----

agora o teu código :

#include <stdio.h>


/* COMPLETAMENTE DESNECESSÀRIO !!!
* int tamanhofrase(char s[]) {
*   int i=0;
*   while(s[i]!='\0') {
*      i++;
*   }
*   return i;
* }
*/

int main() {
  char str1[30],str2[30];
  int i;

  printf("Digite uma frase:");
  fflush(stdout);
  fgets(str1,30,stdin);

  printf("Digite uma frase:");
  fflush(stdout);
  fgets(str2,30,stdin);

/* COMPLETAMENTE DESNECESSÀRIO !!!
* i=tamanhofrase(str1);
* j=tamanhofrase(str2);
*/

/*
* if(i==j) { // comparação de tamanhos desnecessária
*/

     i = 0;
     while (str1[i] != 0 &&                          // enquanto estiveres a comparar caracteres da string
            str1[i] == str2[i]) /*(a!=i || c==0)*/ { // e os caracteres forem iguais

/* código completamente desnecessário
*       if (str1[a] == str2[a]) {
*          c=0;
*       } else {
*          c=1;
*       }
*/
        i++; // incrementas os indice dos caracteres a serem avaliados
     }

     if (str1[i] == 0 && str2[i] == 0) /*(c==0)*/ { // basta verificar se chegaste ao fim das duas strings
        printf("As frases são iguais\n");
     } else {
        printf("As frases não são iguais\n");
     }
/* else do primeiro if - desnecessário
* } else {
*    printf("As frases não são iguais\n");
* }
*/
  return 0;
} 

como vês, complicaste o que era simples

edit : pequena correcção no código

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
SuissoS

Trocando o II pelo && já deu. Mas obrigado por me mostrares uma forma mais simples de resolver. Assim para a próxima vez que me surgir algo do genero ja faço da tua forma.

Share this post


Link to post
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

×
×
  • 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.