Ir ao conteúdo
  • Cadastre-se

C Comparaçao de caracteres de duas strings


mrkiraz

Posts recomendados

Oi, estou tentando fazer um programa que verifica os caracteres de duas strings, e tem de retornar quantas vezes nenhuma das letras se colidem, deslocando a diferença de tamanho para a direta, por exemplo:
SAWLWOSW

SAW                      nesse caso ele desloca 5 vezes pra direita, porém essa palavra só pode ser escrita 3x de forma que nenhuma letra de baixo seja igual alguma de cima

ou

JOAOJOAO          já nesse ele desloca 4 vezes a palavra porém só poderia ser 2 possibilidades

JOAO
 

int i = 0;
int j = 0;
contador=0;
bool igual=false;
for(contador=0; str1[i] && str2[j] != '\0'; contador++)
	{   
         for (str1[i] && str2[j];i++,j++;)
		{
			if (str[i] == str2[j])
			{
				igual;
				break;
			}
		}
			if (!igual)
			{
				contador++;
			}
   		}	
return contador;

em ambos os casos ele esta retornando "2" e com outro teste como 
AAAAAAAA

BB

ele retorna  "1" na contagem, o que não faz sentido pois seria 6 possibilidades porque nenhuma das letras da palavras vão ser iguais.

creio que seja erro bobo de logica, mas se alguém puder me ajudar no que eu poderia fazer ajudaria demais.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@mrkiraz      no primeiro exemplo você quer dizer que a primeira palavra tem essa qtd e caracteres a mais do que a segunda palavra , 
e também não entendi a construção desses Loop's for :

#include <stdio.h>
#include <stdbool.h>
int teste(char*, char*);
int main()
{
    char str1[50]={"qualquer"},
         str2[50]={"coisa e mais alguma coisa"};
    int ret = teste(str1,str2);
    printf("val retornaDo => %d\n\n\n",ret);
    return 0;
}
int teste(char str1[50], char str2[50])
{
    int i = 0;
    int j = 0;
    int contador = 0;
    bool igual = false;
    for(contador=0; str1[i] && str2[j] != '\0'; contador++)
    {   /// Como funciona essa parte Aqui ? -->   str1[i] && str2[j] != '\0';
        for (str1[i] && str2[j];i++,j++;)
        {
            if (str1[i] == str2[j])
            {
                igual; /// Qual a utilidade dessa linha ? !
                break;
            }
        }
        if ( !   igual )  /// se não for diferente de zero
        {
            contador++;   /// incrementa o contador de ?
        }
    }
    return contador;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@devair1010 No primeiro exemplo eu quis dizer q a segunda palavra só poderia ser escrita de 3 formas possíveis se deslocando até o tamanho máximo da primeira  sem que nenhuma das letras sejam tanto iguais na str1 e str2 tipo 

// aqui todas sao iguais, entao não poderia, ai a ideia que tinha em mente seria o "for" que desloca a menor para a direita 

str1=  {S A W L W O S W}

str2 = {S A W} 
// aqui seria possível pois a posição de letras AWL não entraria em conflito com o SAW nessa posição e fazer todos os testes até o final da string e retornar o valor de possibilidades

str1=  {S A W L W O S W}

str2 = {   S A W}

// no terceiro deslocamento e teste ele ja não contabilizaria pois o W esta igual na posiçao da str1 e str2

str1=  {S A W L W O S W}

str2 = {       S A W}

 

#include <stdio.h>
#include <stdbool.h>
int teste(char*, char*);
int main()
{
    char str1[50]={"qualquer"},
         str2[50]={"coisa e mais alguma coisa"};
    int ret = teste(str1,str2);
    printf("val retornaDo => %d\n\n\n",ret);
    return 0;
}
int teste(char str1[50], char str2[50])
{
    int i = 0;
    int j = 0;
    int contador = 0;
    bool igual = false;
    for(contador=0; str1[i] && str2[j] != '\0'; contador++) // a minha ideia aqui seria fazer uma especie de varredura nas duas strings até encontrar o final delas que seria o '\0' 
    {  
        for (str1[i] && str2[j];i++,j++;)
        {
            if (str1[i] == str2[j])
            {
                igual; // aqui seria pra q sempre que ocorrer da letra da str1 e 2 serem iguais o valor booleano seria 0 
                break;
            }
        }
        if ( !   igual )  // aqui seria sempre q o valor acima for diferente de 0 como na regra acima ele contar como possibilidade de escrever a string sem conflitos de alguma letra
        {
            contador++;   
        }
    }
    return contador;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

4 horas atrás, mrkiraz disse:

SAWLWOSW

SAW                      nesse caso ele desloca 5 vezes pra direita, porém essa palavra só pode ser escrita 3x de forma que nenhuma letra de baixo seja igual alguma de cima

então poderia deslocar só uma vez , pois  sem nenhum deslocamento já tem letras iguais , e no segundo deslocamento também terá uma letra igual , 

strings_3.thumb.JPG.ffdccde82898ca4bf5ba0cda5a2adfd2.JPG

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@devair1010  Nesse 1º deslocamento apesar de ter a letra A e a letra W em comum ela esta em uma posição diferente com a segunda string que deslocou pra direita, ou seja nessa situação quero que ela compare apenas a letra A com o S  e respectivamente W com A e L com W.

 

1 hora atrás, devair1010 disse:

então poderia deslocar só uma vez , pois  sem nenhum deslocamento já tem letras iguais , e no segundo deslocamento também terá uma letra igual , 

strings_3.thumb.JPG.ffdccde82898ca4bf5ba0cda5a2adfd2.JPG

No 2º deslocamento as comparações que desejo fazer seria W com S, L com A, e W com W. Nessa situação essa ultima comparação ficou igual W=W.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...