Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Localhost

Procurar letra - não funciona

Mensagens Recomendadas

Localhost

Tenho uma string global com N posições. E tenho de encontrar nessa string a maior substring com Max letras diferentes. O que fiz foi dividir a string global em N-1 posições em substrings de Max posições  e ir indo atribuindo uma string dividida a uma string auxiliar. Ou seja, a string auxiliar vai contêr a substring que foi dividida no momento.

Depois disto o que faço é contar o número de letras diferentes que existem na string auxiliar. Para isto (para ficar mais fácil) recorri à função strchr, no entanto esta não está a ter os resultados que eu quero. Ela dá-me sempre zero quando na maioria das vezes a string auxiliar tem 3 letras diferentes.

Deixo aqui o código para quem quiser ajudar:

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

int main(void) {
char msg[1000000];
char auxString[120];
int max;
scanf("%i", &max);
scanf("%s", msg);
int aux;
int times = 0;
for(aux = 0; aux < strlen(msg) - 1; aux++) {
	int aux2, aux3 = 0;
	for(aux2 = aux; aux2 < max + aux; aux2++,aux3++) {
		auxString[aux3] = msg[aux2];
	}
	for(aux3 = 0; aux3 <= strlen(auxString) - 1; aux3++) {
		times = 0;
		if(!(strchr(auxString,auxString[aux3]))) {
			times++;
		}
	}
	printf("%s → %i\n", auxString, times);
}
return 0;
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Penso que o times tem de estar inicializado antes do último for, e não lá dentro, senão vais estar a inicializá-lo a 0 em cada iteração.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Já sei porque é. De cada vez que fazes o strchr, ele percorre a string toda à procura do caracter. Como vai sempre encontrar o caracter em questão, nunca vai incrementar o times.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Experimenta assim:

strchr(auxString+aux3+1,auxString[aux3])

Acho que assim, só vais percorrer a substring que começa a partir da letra em que estás. Por exemplo, para a string "baderous", com max=3:

1) strchr("ade",'b')

2) strchr("der,'a')

3) strchr("ero",'d')

Não sei se assim dá, mas testa, estou um bocado distraído.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Pois mas isso não me serve porque o que eu queria é que ele visse se a letra existe em algum lugar na string e não só à frente da letra que quero.

O que eu pensei fazer foi: verificar se o retorno da função strchr estava na mesma posição da letra que estou a procurar, se estiver, implementar o que disseste.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Baderous, obrigado pelo ideia. Já consegui implementar.

Deixo aqui:

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

int main(void) {
  char msg[1000000];
  char auxString[120];
  int max;
  scanf("%i", &max);
  scanf("%s", msg);
  int aux;
  int times = 0;
  for(aux = 0; aux < strlen(msg) - 1; aux++) {
    int aux2, aux3 = 0;
    for(aux2 = aux; aux2 < max + aux; aux2++,aux3++) {
      auxString[aux3] = msg[aux2];
    }
    times = 0;
    for(aux3 = 0; aux3 <= strlen(auxString) - 1; aux3++) {
      if((strchr(auxString,auxString[aux3])) ==  &auxString[aux3]) {
        if(!(strchr(auxString+aux3+1,auxString[aux3]))) {
   times++;
        }
      }else {
times++;
      }
    }
   printf("%s → %i\n", auxString, times);
}
return 0;
}

Já agora dá-me um feedback porque só testei uma vez.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Espero bem que sim porque isto parece-me que vai ficar grande e espero depois não ter de refazer tudo só por causa deste problema.

p.s. O teu post ficou com um grande espaço depois do teu último ponto final (espaço para baixo)  :P


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.