iatauro Posted March 19, 2021 at 08:23 PM Report Share #621766 Posted March 19, 2021 at 08:23 PM Olá, preciso fazer um código em C que leia um string (informado pelo usuário) e que ache uma palavra dentro desse string( a palavra a ser procurada também será informada pelo usuário) e no final mostre quantas vezes essa palavra apareceu. Por enquanto meu código está assim, infelizmente não consegui completar, alguém poderia me ajudar? #include<stdio.h> #include<string.h> #include<stdlib.h> int main(){ system("color 47"); char texto[501], busca[26]; int i, l, k, j, soma, resultado; printf("Escreva a palavra a ser buscada: "); fflush(stdin); gets(busca); printf("\nEscreva uma frase contendo no maximo 500 caracteres: "); fflush(stdin); gets(texto); soma = 0; l = strlen(texto); k = strlen(busca); resultado = strcmp(busca, texto); for(i=0; i<l; i++){ for(j=0;j<k;j++){ if(resultado==0){ soma++; } } } printf("%d", soma); return 0; } Link to comment Share on other sites More sharing options...
rbsrbs_dev Posted March 19, 2021 at 10:30 PM Report Share #621767 Posted March 19, 2021 at 10:30 PM Olá iatauro, Deves ter cuidado com a indentação das linhas. Não sei se estás a par disso, mas a linha onde chamas o strcmp embora esteja indentada (erradamente) está fora do ciclo e só é executada uma vez. Outro problema é o facto de o strcmp fazer uma comparação completa das strings, o que neste caso não é o que pretendes, porque só irias ter o resultado correto caso o `texto` não tivesse nenhuma ocorrência de `busca` ou se fossem exatamente as mesmas strings. A resolução mais próxima do que tens seria usar strncmp que faz a comparação de um número fixo de caracteres, que neste caso será o tamanho da string `busca`. Seria algo assim: for (i = 0; i < l; i++) { resultado = strncmp(&texto[i], busca, k); if (resultado == 0) soma++; } Uma outra alternativa usando funções standard é usares strstr que é basicamente o teu exercício, dentro de um ciclo. char * cur = texto; while (cur < texto + texto_len && (cur = strstr(cur, busca))) { cur++; soma++; } Fica como trabalho de casa a explicação 😉 Caso estejas interessado em algoritmos mais eficientes tens aqui uma listagem de alguns. Sugiro-te o Boyer–Moore. Outras observações: Convêm ganhares habito de dar melhores nomes às variáveis (e.g: l, k), porque só te dificulta a programares e quem lê o teu código agradece. Não deves usar a função gets. É extremamente insegura (buffer-overflows) e principalmente porque foi removida no standard C11. Deves usar a função gets_s adicionada em C11 ou então de preferência fgets. Neste caso terias algo do género: fgets(busca, 26, stdin); fgets(texto, 501, stdin; É recomendado criares macros para os tamanhos dos teus buffers para evitares repetires-te a escrever os mesmos números e possíveis erros que possam advir. E.g.: #define TEXTO_TAMANHO 501 #define BUSCA_TAMANHO 26 Isto fflush(stdin); é incorreto e deves parar de o fazer. Se o objetivo é limpares o buffer do stdin deves criar uma função para tal, por exemplo: void limpa_stdin(void) { int c; while ((c = getchar()) != '\n' && c != EOF) ; } O uso da função system é desaconselhado. Para pequenos programas teus não há grande problema, mas é só para teres em conta em não ganhares o habito de a usar. As principais razões são: o comando passado como argumento não será cross-platform (neste caso o comando color); função pesada a nível de performance. Link to comment Share on other sites More sharing options...
iatauro Posted March 20, 2021 at 02:51 PM Author Report Share #621769 Posted March 20, 2021 at 02:51 PM Em 19/03/2021 às 23:30, rbsrbs_dev disse: char * cur = texto; while (cur < texto + texto_len && (cur = strstr(cur, busca))) { cur++; soma++; } Olá, estou iniciando ainda em programação, poderia me explicar esse conceito? Não entendi como devo fazê-lo e nem como funciona, agradeço pela explicação anterior Link to comment Share on other sites More sharing options...
PsySc0rpi0n Posted April 30, 2021 at 09:58 PM Report Share #622169 Posted April 30, 2021 at 09:58 PM (edited) On 3/20/2021 at 2:51 PM, iatauro said: Olá, estou iniciando ainda em programação, poderia me explicar esse conceito? Não entendi como devo fazê-lo e nem como funciona, agradeço pela explicação anterior Conheces os operadores AND, OR, etc? && é um AND. AND 0 && 0 = 0 0 && 1 = 0 1 && 1 = 1 Por outras palavras, e no contexto, significa que o loop while só repete enquanto as duas condições forem verdadeiras. Basta uma delas ser falsa e o loop pára. while(x < 100 && x > 0) { printf("Yay\n"); } Neste caso, se o valor de 'x' não estiver entre 0 e 100, o printf nunca é executado porque uma ou as duas condições falham. Para que não haja enganos, em C (e não só), uma condição veradeira é normalmente representada por um 0 e uma condição falsa é representada por um valor diferente de 0. Por exemplo, a seguinte linha de código: x = y; que é uma atribuição de um valor, neste caso o valor guardado em 'y', à variável 'x', vai devolver 0 por si só, porque a operação de atribuição irá sempre acontecer com sucesso, a não ser que um probelma muito grave de memória ou algum problema no cpu impeça a atribuição, que é o caso de uma das condições do loop while: (cur = strstr(cur, busca)) No exemplo do código do OP: char * cur = texto; while (cur < texto + texto_len && (cur = strstr(cur, busca))) { // cur e soma só são incrementados caso (cur < texxto_len) E o resultado // devolvido pela função strstr() for igual a cur cur++; soma++; } Edited April 30, 2021 at 10:00 PM by PsySc0rpi0n Kurt Cobain - Grunge misses you Nissan GT-R - beast killer Link to comment Share on other sites More sharing options...
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