Gurzi Posted May 21, 2006 at 08:02 PM Report #28696 Posted May 21, 2006 at 08:02 PM 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)); }
TheDark Posted May 21, 2006 at 09:11 PM Report #28727 Posted May 21, 2006 at 09:11 PM 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.
mogers Posted May 21, 2006 at 09:19 PM Report #28733 Posted May 21, 2006 at 09:19 PM 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.
Gurzi Posted May 22, 2006 at 06:12 PM Author Report #28935 Posted May 22, 2006 at 06:12 PM quais as vantagens de while(1) ou desvantagens comparando com while(k !=strlen(str2) ) ??
Warrior Posted May 22, 2006 at 07:15 PM Report #28946 Posted May 22, 2006 at 07:15 PM 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..
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now