FórumGdH

Página Inicial do Guia do Hardware

Registrar FAQ Calendário Pesquisar Mensagens de Hoje Marcar Fóruns Como Lidos

Voltar   FórumGdH > Profissional > Programação, scripts, web e banco de dados
Bem-vindo ao FórumGdH
Não se esqueça de se registrar, é grátis . Nós temos 754.116 usuários, convidamos você fazer parte de nossa comunidade também! Se ainda não encontrou o que procura use nossa pesquisa. Esperamos que aprecie nosso trabalho.

Resposta
 
Opções do Tópico
Antigo 28-04-2005, 7:03   #1 (permalink)
Wilton
Membro Senior
 
Registrado em: Mar 2003
Mensagens: 157
Reputação: 19 Wilton está indo no caminho certo
Padrão Linguagem C - procurar string

Pessoal, eu estou com o seguinte probleminha. Eu tenho uma variável.

x = 'textooooooooooooooooooooooooooooooooooooooooooooo o'

então eu tenho uma variavel:

buscar = 'qualquer'

eu preciso procurar dentro desta minha variável x a quantidade de vezes que apareceu a palavra "qualquer" que está na variável buscar. Alguém saberia me dizer como eu posso fazer isto?

Desde já agradeço.

Wilton
__________________
Wilton - Newbie
Wilton está offline   Responder com Quote
Antigo 28-04-2005, 8:34   #2 (permalink)
Lgub
Super Participante
 
Avatar de Lgub
 
Registrado em: Dec 2001
Mensagens: 937
Reputação: 22 Lgub está indo no caminho certo
Padrão

Vc pode usar a strpbrk() da string.h
Mais ela só procura uma vez, vc vai precisar fazer um loop para percorrer toda a string.
__________________
Linux User:#326216
Intel I7 - 920 - 6G DDR3 Tripple Channel @1600 - Geforce 285 1G.
Programador ADVPL(Fazer o que é o que ta pagando as contas no momento...)
Lgub está offline   Responder com Quote
Antigo 28-04-2005, 8:46   #3 (permalink)
intruso
Tô em todas
 
Avatar de intruso
 
Registrado em: Apr 2002
Localização: Paulista/PE
Mensagens: 1.600
Reputação: 76 intruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputação
Padrão

Presupondo que suas variáveis estão declaradas corretamente como vetores de caracteres, vou dar uma sugestão ai vc pensa um pouco e tenta implementar.

Você concorda que se uma palavra existir dentro do seu "texto" a primeira letra tem de existir?? então cria uma rotina "procura" que verifica a primeira letra, dentro dessa rotina você coloca uma variavel status (que vai indicar se você está dentro da palavra procurada), logo se primeira letra é encontrada e status igual a "fora" compare a segunda letra, se a segunda letra coincidir com a da palavra procurada, continue verificando caso contrário, status igual a fora e procure a primeira letra. Isso até o fim do vetor, lógico que você tera de implementar uma rotina que informa se foi encontrada a palavra inteira e que armazena um contador para informar a quantidade encontrada no final do programa.

Veja que esta resposta não é a mais eficiente, o tempo de execução vai ser uma desvantagem (ele tem de verificar todo o vetor, ai, se for grande ja viu né?)

Lembre que os caracteres em C são diferenciados no que diz respeito a maiúscula e minúscula, logo recomendo que você implemente na procura uma conversão ou converte o caracter analisado para minúsculo ou para maiúsculo e só depois compara.

Existem alguns ajustes que você pode fazer no algorítimo para melhorar um pouco o desempenho, crie o código que depois debatemos.

t+
__________________
Dê uma lida:
Eu não dou o peixe, ensino a pescar.

Meu Blog.
intruso está offline   Responder com Quote
Antigo 28-04-2005, 20:49   #4 (permalink)
Wormer
Zumbi
 
Registrado em: Mar 2002
Localização: Salto - SP
Idade: 28
Mensagens: 6.339
Reputação: 28 Wormer está indo no caminho certo
Enviar mensagem via MSN para Wormer
Padrão

Tem a função strtotok(), mas acho que é do C++, ela transforma strings em tokens, ou seja, separa por palavras. Fazendo isso dá pra passar pra um vetor, e aí é só percorrer.
__________________
Por favor evitem fazer perguntas técnicas por MP, o fórum existe para isso.

EeePC 4G 701 + Windows Vista Ultimate
Wormer está offline   Responder com Quote
Antigo 28-04-2005, 22:24   #5 (permalink)
jackinabox
Veterano
 
Avatar de jackinabox
 
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16 jackinabox está indo no caminho certo
Padrão

[quote="Wormer"]Tem a função strtotok(), mas acho que é do C++, ela transforma strings em tokens, ou seja, separa por palavras.
Nope. Não existe strtotok() em nenhuma biblioteca padrão C/C++. O que existe é a função strtok(char *str, const char *delimitadores), a qual, em chamadas sucessivas, retorna os tokens contidos na string str. Os tokens são delimitados pelos caracteres contidos em delimitadores.

Ou seja, strtok() não serve para resolver o problema do Wilton.

Mas, se vale utilizar funções de biblioteca, talvez strstr() possa ajudar:

http://www.cplusplus.com/ref/cstring/strstr.html

A questão é: pode haver sobreposição da string procurada? Por exemplo:

Quantas vezes a palavra "careca" ocorre em
abccarecarecarecaxyz :?:
__________________
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox está offline   Responder com Quote
Antigo 29-04-2005, 0:32   #6 (permalink)
jqueiroz
Highlander
 
Avatar de jqueiroz
 
Registrado em: May 2002
Localização: Tijuca/RJ
Idade: 9
Mensagens: 87.724
Reputação: 778 jqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputaçãojqueiroz tem uma fabulosa reputação
Padrão

Citação:
Quantas vezes a palavra "careca" ocorre em
abccarecarecarecaxyz :?:
se valesse usar Expressões Regulares, era mole...

por exemplo em Perl (que suporta RegEx) eu faço assim:

Código:
my $x = "abccarecarecarecaxyz"; my $count = 0; while ( $x =~ /careca/g ) { ++$count; } print "$count vezes\n";
__________________
Visite Quepolis (link de indicação) | "chmod 777 nunca ajudou ninguém" (c) 2002-2010 JQueiroz/FGdH
CCNP: √ ² CCSI: □ | Conheça o Novo Bebuns
jqueiroz está offline   Responder com Quote
Antigo 29-04-2005, 8:56   #7 (permalink)
intruso
Tô em todas
 
Avatar de intruso
 
Registrado em: Apr 2002
Localização: Paulista/PE
Mensagens: 1.600
Reputação: 76 intruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputação
Padrão

Citação:
Postado Originalmente por jackinabox
[A questão é: pode haver sobreposição da string procurada? Por exemplo:

Quantas vezes a palavra "careca" ocorre em
abccarecarecarecaxyz
Acho que não tem problema com relação a sobreposição, depende de como o texto esta armazenado, eu estou deduzindo que seja um texto comum (uma carta por exemplo) nesse caso, o problema será relativo ao conceito de palavra.

Se ele simplesmente implementar a rotina sem levar em consideração testes para verificar a entrada e saida de palavras, ai vale a sobreposição.

Pode-se considerar como palavra um conjunto de caracteres delimitados por caracteres "em branco" (tabulações, espaços, nova linha) isso resolveria o problema de sobreposição.

Outra alternativa seria basear o inicio da palavra na primeira localização do primeiro caracter da palavra, evitando buscas repetidas no primeiro caracter, foi o que tentei explicar no primeiro post. Essa alternativa elimina a necessidade de verificar o limite das palavras (espaços em branco).

O problema seria pesquisar o vetor inteiro, dependendo do tamanho do texto isso ia demoooraaarrrrr ...zzzz.
__________________
Dê uma lida:
Eu não dou o peixe, ensino a pescar.

Meu Blog.
intruso está offline   Responder com Quote
Antigo 29-04-2005, 12:01   #8 (permalink)
jackinabox
Veterano
 
Avatar de jackinabox
 
Registrado em: Nov 2004
Mensagens: 1.055
Reputação: 16 jackinabox está indo no caminho certo
Padrão

Citação:
O problema seria pesquisar o vetor inteiro, dependendo do tamanho do texto isso ia demoooraaarrrrr ...zzzz.
Hummm, obviamente depende fundamentalmente da implementação. Use um grep (unix) em um arquivo texto com 10 MB, por exemplo, para ver a velocidade. Ei, aliás pode ser uma boa idéia: olhar o código fonte de uma implementação decente do grep... Será que vamos descobrir que ele utiliza strstr()?
__________________
Jeferson Charles Mayer

"Como é que eu vou enxergar a tal floresta, com todas essas árvores atrapalhando a visão?"
jackinabox está offline   Responder com Quote
Antigo 29-04-2005, 14:30   #9 (permalink)
intruso
Tô em todas
 
Avatar de intruso
 
Registrado em: Apr 2002
Localização: Paulista/PE
Mensagens: 1.600
Reputação: 76 intruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputaçãointruso tem uma fabulosa reputação
Padrão

a primeira, pergunta: Para resolver o problema vale usar a biblioteca padrão? ou é algum exercício de curso ou faculdade? não gosto de postar código fonte porque as pessoas vem aqui para que os outros façam os trabalhos, é por isso que só dou as idéias para resolução.

a segunda: A função strstr() retorna um apontador, o rapaz que fez a pergunta sabe usar apontadores?

a terceira pergunta: o grep usa strstr()?

Uma possível solução, mais tem que ser modificada pois, retorna um inteiro com o índice onde foi localizada a string, se não for encontrada retorna -1, assim, se for exercício eu não respondi tua pergunta, pensa e reponde sozinho, o código:

Código:
int localiza(char s[], char t[]) { int i,j,k; for(i=0;s[i]!='\0';i++) { for(j=i,k=0;t[k]!='\0' && s[j]==t[k];j++,k++) ; if(k>0 && t[k]=='\0') return i; } return -1; }

:?
t+
__________________
Dê uma lida:
Eu não dou o peixe, ensino a pescar.

Meu Blog.
intruso está offline   Responder com Quote
Resposta


Opções do Tópico

Regras de Mensagens
Você não pode criar tópicos
Você não pode postar respostas
Você não pode anexar arquivos
Você não pode editar suas mensagens

Código vB está Ligado
Smiles estão Ligado
Código [IMG] está Ligado
Código HTML está Desligado
Ir para...


Horários baseados na GMT -3. Agora são 13:14.