Jump to content

Recommended Posts

Posted

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. 😄

#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));
}
       
       
       


Posted

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 😄 , 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.

Desaparecido.

Posted

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

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Posted

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

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.