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

Gurzi

Strings detection

5 mensagens neste tópico

Boas malta, estou a fazer um programa , ou melhor estava , no qual ele vai receber uma string por exemplo olatiagoola e eu quero que ele encontre a posição de memória para tiago. o que eu fiz foi usar a variável k que vai contar quantos caracteres tem o que eu pretendo encontrar e só quando o ciclo while andar o mesmo numero de vezes que k é que ele diz, está aqui, caso contrário o j volta a  0. Não estou a conseguir  , ele compila mas deve haver algum erro na lógica. :D

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

       char str1[20];
       char str2[10];
       int k=0;
       int j=0;
       int i=0;
       char *ptr=NULL;

char *str(char *str1,char *str2)
{
            while(1)
       {
          j=0;
          while (str1[i]!=str2[j])
          i++;
          *ptr = str1[i];
          while (str1[i]==str2[j])
          {
                
                j++;
                i++;
                k+=1;
          }
          if (k == (int)strlen(str2))
          {
           return ptr;
            
            break;
          }       
       }
}
     

int main()
{
       

       
       printf("Introduza uma string complexa\n");
       gets(str1);
       printf("Introduza a string que pretende localizar\n");
       gets(str2);
       
        printf("Localiza na %d posicao de memoria\n",str(str1,str2));
}
       
       
       


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em 1º lugar, e dado que passas as variáveis str1 e str2 como parâmetro à função str, devias declará-las dentro da main(), ou então removê-las dos parâmetros da str(). Da mesma maneira, i, j e k são utilizadas apenas na função str, pelo que deveriam ser declaradas no início da mesma.Mas isto é só para diminuir alguma confusão...

Agora a lógica...

Em vez de while, eu escolheria um for. Os fors existem para serem utilizados quando queremos inicializar uma variável antes de usar o ciclo a 1ª vez, queremos quebrar o ciclo quando existe uma dada condição, e queremos modificar uma variável (ou mais) no final do ciclo. Encaixa que nem uma luva :D, senão vê:

  • Queres colocar i a 0 no inicio do ciclo
  • queres manter-te no ciclo enquanto não chegares ao fim da string
  • queres incrementar i no fim de cada iteração

dentro do for, queres que j=0, k=i, e queres incrementar j e k enquanto str1[k]==str2[ i ] e nenhum deles seja igual ao caracter terminador; quando terminas este ciclo interior, verificas se o tamanho da string que queres procurar é igual a j; se for, retornas o endereço de str1[ i ]; senao, retornas, continuas o for exterior. Quando o for chegar ao fim, significando que não encontraste a string pretendida, retornas por exemplo 0.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O teu programa estoura aqui:

*ptr = str1[i];

altera para

 ptr = &str1[i];  // pointer fica com o endereço de memória da posição do array.

Tal como o TheDark penso que deves definir aquelas variaveis como locais na main()

Quanto ao codigo... eu retirava o  While ( 1 ) e substituia por

k=0;
int len=strlen(str2);
while (k != len)
{
  // o mesmo codigo sem a condição k está no while
}
return ptr;   // assumindo que a palavra é sempre encontrada no texto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

quais as vantagens de while(1) ou desvantagens comparando com while(k !=strlen(str2) ) ??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

um

while (k!=strlen(str2))

é muito mais claro do que um

while (1) {

..

if (k==strlen(str2)) break;

..

}

Um while serve para lhe ser aplicada uma condição, durante a qual o código é executado.

O uso de breaks deve ser evitado..

0

Partilhar esta mensagem


Link 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