Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Neji

Procurar palavra num array de char

Recommended Posts

Ola Boa tarde,

Tenho os seguintes parâmetros

char* search(char* palavra,char*texto ) {


}



eu sei como ir buscar o tamanho do array palavra e array texto neste caso array palavra tem o tamanho i,
e o array texto tem o tamanho j.

o que eu quero é encontrar no array texto a palavra do array palavra. e caso tenha encontrado devolver a posição onde começa no array texto.

por exemplo

 

 

palavra=JOAO

J na posicao 0

O na posição 1 e assim sucessivamente

 

 

e no array texto =blableaJOAOblablaJOAOBLABLA

 

neste caso aparece 2 vezes no array texto

 

então devolve a posição 8 e a posição 18 que são onde começam.

 

não sei se me expliquei bem.

já agora não quero usar funções predefinidas

 

 

 

Obrigado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem um array com palavras ou uma array com letras que formam uma palavra?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem um array com palavras ou uma array com letras que formam uma palavra?

 

Um array com letras que formam uma palavra.

 

Ambos são assim.

 

 

ja tentei uma coisa do genero.

 

 

 

char* pos(char* C,char* S) {
int cont=0;
int b;
int total=0;
int n=0;   
int m=0;   
char buffer[1024] = {0};
int s=0;
int i;
int j;
char texto[100];



m=sprintf (buffer, "%s", C);// tamanho do array c
n=sprintf (buffer, "%s", S);// tamanho do array S
n=n-1; //menos 1 por causa do input

	for(i=0;i<=n;i++)
{
		if(cont==m)
{
texto[s++]=i-m;
j=0;
total++;
}
		if(C[j]==S[i]){

	for(j=0;j<=m;j++){

		if(C[j]==S[i])
{
cont++;
i++;
}
		else
{
cont=0;
i++;
total++;
}

}
}
}


for (b=0;b<=total;b++)
{
printf("%d\n",texto[b]);
}
return 0;
      }

 

mas não da :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem não entendi muito bem para que você que essa função mas creio eu que já exista funções para sortear itens em arrays.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já consigo encontrar mas, não consigo encontrar a posição seguinte.

 

char* pos(char* C,char* S) {
int b=0;
int total=0;
int n=0;   
int m=0;   
char buffer[1024] = {0};
int s=0;
int i;
int j;
int cont=0;
char texto[100];



m=sprintf (buffer, "%s", C);// tamanho do array c
n=sprintf (buffer, "%s", S);// tamanho do array S
n=n-1; //menos 1 por causa do input

for(i=0;i<n;i++)
{
j=0;
if(total==m){
texto[s++]=i-m;
}
if(j==m)
{
j=0;
cont++;
}
if(C[j]==S[i])
{
for(j=0;j<m;j++)
{
if(C[j]==S[i])
{
i++;
total++;
}
else
{
total=0;
j=m;
}
}
}
}


for(b=0;b<=2;b++)
{
printf("%d\n",texto[b]);
}
return 0;
      }

 

Bem não entendi muito bem para que você que essa função mas creio eu que já exista funções para sortear itens em arrays.

 

 

 

eu na quero sortear eu quero através de um array x com m elementos e um array y com n elementos, encontrar o elemento de x em y.

o problema e que por exemplo o nome Joana não esta todo na posição [0] mas sim em todos os elementos do array x e de igual modo para o array y, mas em y tem muitos mais elementos, sendo que tenho que comparar posição a posição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já existe uma função que faça isso. É a "strstr()" da biblioteca "string.h".

Exemplo:

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

char* pos(char* C,char* S)
{
    return strstr(C, S);
}

int main(void)
{
    char palavra[] = "JOAO";
    char texto[] = "blableaJOAOblablaJOAOBLABLA";
    char *posicao = texto;
    char qtdEncontrada = 0;

    while(1)
    {
        posicao = pos(posicao, palavra);
        if (posicao == NULL)
            break;

        qtdEncontrada++;
        posicao = &posicao[strlen(palavra)];
    }

    printf("Palavra encontrada %d veze(s)\n", qtdEncontrada);

    return (0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Já existe uma função que faça isso. É a "strstr()" da biblioteca "string.h".

Exemplo:

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

char* pos(char* C,char* S)
{
    return strstr(C, S);
}

int main(void)
{
    char palavra[] = "JOAO";
    char texto[] = "blableaJOAOblablaJOAOBLABLA";
    char *posicao = texto;
    char qtdEncontrada = 0;

    while(1)
    {
        posicao = pos(posicao, palavra);
        if (posicao == NULL)
            break;

        qtdEncontrada++;
        posicao = &posicao[strlen(palavra)];
    }

    printf("Palavra encontrada %d veze(s)\n", qtdEncontrada);

    return (0);
}

 

 

Preciso fazer sem usar funções pré definidas, de qualquer modo obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Re-inventando o "strstr()":


char* pos(char* C,char* S)

{

char *posicao = C;

unsigned int i = 0;

 

while(1)

{

if( posicao[0] == S[0] ) // Busca posicão que iguala a primeira letra da palavra

{

for (i = 0; i < strlen(S); i++) // Verifica se as demais letras são iguais

{

if(posicao != S) // Se encontrar diferente, zera o "i" e cancela o "for()"

{

i = 0;

break;

}

}

 

if( i == strlen(S) ) // Se não houver diferença, "i" e "strlen()" terão o mesmo tamanho

return &posicao[0];

}

 

if( posicao[1] != '\0' ) // Enquanto não chegar no final do texto, "posicao" irá pra posição do vetor.

posicao = &posicao[1];

else

return NULL;

 

}

}




			
		

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Re-inventando o "strstr()":

char* pos(char* C,char* S)
{
    char *posicao = C;
    unsigned int i = 0;

    while(1)
    {
        if( posicao[0] == S[0] ) // Busca posicão que iguala a primeira letra da palavra
        {
            for (i = 0; i < strlen(S); i++) // Verifica se as demais letras são iguais
            {
                if(posicao != S) // Se encontrar diferente, zera o "i" e cancela o "for()"
                {
                    i = 0;
                    break;
                }
            }

            if( i == strlen(S) ) // Se não houver diferença, "i" e "strlen()" terão o mesmo tamanho
                return &posicao[0];
        }

        if( posicao[1] != '\0' ) // Enquanto não chegar no final do texto, "posicao" irá pra posição do vetor.
            posicao = &posicao[1];
        else
            return NULL;

    }
}

tive a testar e não funcionou só troquei o strlen pois estou a usar outro método auxiliar já que não posso usar funções isso não me retorna nada apenas continuo a escrever na consola e não me retorna nada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Re-inventando o "strstr()" e o "strlen()":


unsigned int getSize(char *texto)

{

int i = 0;

 

while( texto != '\0' )

i++;

 

return i;

}

 

char* pos(char* C,char* S)

{

char *posicao = C;

unsigned int i = 0;

 

while(1)

{

if( posicao[0] == S[0] ) // Busca posicão que iguala a primeira letra da palavra

{

for (i = 0; i < getSize(S); i++) // Verifica se as demais letras são iguais

{

if( posicao != S ) // Se encontrar diferente, zera o "i" e cancela o "for()"

{

i = 0;

break;

}

}

 

if( i == getSize(S) ) // Se não houver diferença, "i" e "strlen()" terão o mesmo tamanho

return &posicao[0];

}

 

if( posicao[1] != '\0' ) // Enquanto não chegar no final do texto, "posicao" irá pra posição do vetor.

posicao = &posicao[1];

else

return NULL;

 

}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Re-inventando o "strstr()" e o "strlen()":

unsigned int getSize(char *texto)
{
    int i = 0;

    while( texto[i] != '\0' )
        i++;

    return i;
}

char* pos(char* C,char* S)
{
    char *posicao = C;
    unsigned int i = 0;

    while(1)
    {
        if( posicao[0] == S[0] ) // Busca posicão que iguala a primeira letra da palavra
        {
            for (i = 0; i < getSize(S); i++) // Verifica se as demais letras são iguais
            {
                if( posicao[i] != S[i] ) // Se encontrar diferente, zera o "i" e cancela o "for()"
                {
                    i = 0;
                    break;
                }
            }

            if( i == getSize(S) ) // Se não houver diferença, "i" e "strlen()" terão o mesmo tamanho
                return &posicao[0];
        }

        if( posicao[1] != '\0' ) // Enquanto não chegar no final do texto, "posicao" irá pra posição do vetor.
            posicao = &posicao[1];
        else
            return NULL;

    }
}

Nao funciona, tive de tirar o while(1) para me devolver valores.

Mas de qualquer modo devolve me sempre 0.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito estranho. o código aqui funcionou.

Vou postar ele completo:

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

unsigned int getSize(char *texto)
{
    int i = 0;

    while( texto[i] != '\0' )
        i++;

    return i;
}

char* pos(char* C,char* S)
{
    char *posicao = C;
    unsigned int i = 0;

    while(1)
    {
        if( posicao[0] == S[0] ) // Busca posicão que iguala a primeira letra da palavra
        {
            for (i = 0; i < getSize(S); i++) // Verifica se as demais letras são iguais
            {
                if( posicao[i] != S[i] ) // Se encontrar diferente, zera o "i" e cancela o "for()"
                {
                    i = 0;
                    break;
                }
            }

            if( i == getSize(S) ) // Se não houver diferença, "i" e "strlen()" terão o mesmo tamanho
                return &posicao[0];
        }

        if( posicao[1] != '\0' ) // Enquanto não chegar no final do texto, "posicao" irá pra posição do vetor.
            posicao = &posicao[1];
        else
            return NULL;

    }
}

int main(void)
{
    char palavra[] = "JOAO";
    char texto[] = "blableaJOAOblablaJOAOBLABLA";
    char *posicao = texto;
    char qtdEncontrada = 0;

    while(1)
    {
        posicao = pos(posicao, palavra);
        if (posicao == NULL)
            break;

        qtdEncontrada++;
        posicao = &posicao[strlen(palavra)];
    }

    printf("Palavra encontrada %d veze(s)\n", qtdEncontrada);

    return (0);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Muito estranho. o código aqui funcionou.

Vou postar ele completo:

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

unsigned int getSize(char *texto)
{
    int i = 0;

    while( texto[i] != '\0' )
        i++;

    return i;
}

char* pos(char* C,char* S)
{
    char *posicao = C;
    unsigned int i = 0;

    while(1)
    {
        if( posicao[0] == S[0] ) // Busca posicão que iguala a primeira letra da palavra
        {
            for (i = 0; i < getSize(S); i++) // Verifica se as demais letras são iguais
            {
                if( posicao[i] != S[i] ) // Se encontrar diferente, zera o "i" e cancela o "for()"
                {
                    i = 0;
                    break;
                }
            }

            if( i == getSize(S) ) // Se não houver diferença, "i" e "strlen()" terão o mesmo tamanho
                return &posicao[0];
        }

        if( posicao[1] != '\0' ) // Enquanto não chegar no final do texto, "posicao" irá pra posição do vetor.
            posicao = &posicao[1];
        else
            return NULL;

    }
}

int main(void)
{
    char palavra[] = "JOAO";
    char texto[] = "blableaJOAOblablaJOAOBLABLA";
    char *posicao = texto;
    char qtdEncontrada = 0;

    while(1)
    {
        posicao = pos(posicao, palavra);
        if (posicao == NULL)
            break;

        qtdEncontrada++;
        posicao = &posicao[strlen(palavra)];
    }

    printf("Palavra encontrada %d veze(s)\n", qtdEncontrada);

    return (0);
}

mandei mensagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está me parecendo que você já não quer AJUDA, e sim a RESPOSTA para o seu problema...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está me parecendo que você já não quer AJUDA, e sim a RESPOSTA para o seu problema...

A diferença entre pedir ajuda e pedir a resposta é que quem pede ajuda faz alguma coisa para acabar o problema quem pede apenas a resposta fica sentado a espera que os outros façam por si, eu ja tinha muita coisa feita mas o meu processo estava mal e confuso a única coisa que eu pedi aqui foi o algoritmo que eu não consigo mesmo fazer, é preciso muita lata para você dizer isso quando eu estou a tentar resolver o problema há 2 dias e pouco dormi.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sugiro começar pensando na interface da sua função. Sugiro que reconsidere seus parâmetros e tipo de retorno.

 

Isto requer refinamento da definição de seu problema. Se eu tivesse que escrever a função, usaria o seguinte tipo:

 

 

unsigned int list_occurr(const char *haystack, const char *needle, size_t *indices, size_t max);

 

A função retorna um número inteiro maior ou igual a 0, correspondente à quantidade de vezes que `needle` ocorre em `haystack`. Os índices em si são armazenados no vetor para o primeiro elemento do qual `indices` aponta. A função armazenará até `max` índices no array de índices encontrados. A função não modifica `haystack` e nem `needle`.

 

Veja se consegue escrever esta função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#include <stdio.h>intscmp (const char* s1, const char* s2){    while(*s1 == *s2++)        if(*s1++ == '\0')            return 0;    return 1;}char*search (const char* s, const char* w){    while(*s != '\0')    {        if(*s == *w)            if(scmp(s, w))                return (char*) s;        s++;    }    return NULL;}intmain (int argc, char** argv){    const char tx[] = "blableaJOAOblablaJOAOBLABLA", wx[] = "JOAO";    const char* s = tx;        while((s = search(s, wx)) != NULL)    {        printf("%s\t%d\n", s, s - tx);        s += sizeof(wx);    }    return 0;}

 

 

Cometi um erro na função scmp. Correção:

 

intscmp (const char* s1, const char* s2){    while(*s2 != '\0')        if(*s2++ != *s1++)            return 0;    return 1;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.