Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Localhost

Procurar letra - não funciona

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
Localhost

Ah! Porque o caracter existe sempre pelo menos uma vez na substring.

Sabes como é que se pode resolver isso?


here since 2009

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

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
Sign in to follow this  

×

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.